Spring6

Spring6

Spring项目的创建

  • 打开IDEA,新建一个maven项目

  • 在maven项目中引入spring的仓库和依赖

     <repositories>
            <repository>
                <id>repository.spring.milestone</id>
                <name>Spring Milestone Repository</name>
                <url>https://repo.spring.io/milestone</url>
            </repository>
        </repositories>
    
        <dependencies>
            <!--spring6-->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
                <version>6.0.3</version>
            </dependency>
        </dependencies>
    
  • 编写Spring配置文件。

    • maven成功引入Spring之后,在resource目录下新建一个Spring配置文件,名称任意。
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        <!--    spring 配置文件,名字任意,最好放在根目录下,方便后期移植-->
    </beans>
    
  • 配置bean

    • 在Java目录下新建一个类,在Spring6配置文件中配置bean
    <!--    配置bean,这样spring才能帮助我们管理这个对象-->
    <!--    bean标签有两个重要的属性,-->
    <!--    	--id    是bean的唯一标志,不能重复-->
    <!--    	--class 必须是全路径,全限定类名(带包名的类名)-->
    
    <bean id="studentBean" class="com.winter.spring6.bean.studentBean"/>
    
  • 编写测试程序

    • 引入junit依赖
    • 编写测试程序
    package com.winter.spring6.test;
    
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    /**
     * @author Winter
     * @version 1.0
     * @since 1.0
     */
    
    public class FirstSrpingTest {
        @Test
        public void testFristSpringCode(){
    //        第一步 获取spring容器对象
    //        ApplicationContext 翻译为应用上下文,其实就是spring容器
    //        ApplicationContext是一个接口,该接口下有很多实现类,其中一个就是ClassPathXmlApplicationContext
    //        ClassPathXmlApplicationContext是专门从类路径加载spring配置文件的上下文对象
            ApplicationContext context = new ClassPathXmlApplicationContext("Spring.xml");
    //        第二步 根据bean的id从这个spring容器中获取这个对象
            Object studentBean = context.getBean("studentBean");
            System.out.println(studentBean);
        }
    }
    

    控制台输出:

    com.winter.spring6.bean.studentBean@158d2680
    

    表示第一个Spring程序完成,Spring成功创建了一个student对象

第一个Spring程序的一些小细节

  1. bean标签的id属性不可以重复

  2. 底层是怎样创建对象的?

    • 默认情况下Spring会通过反射机制,调用类的无参数构造方法来实例化对象

    •   Class clazz = Class.forName("com.winter.spring6.bean.student")
        Object obj = clazz.newInstance();
      
    • 要想让Spring帮你创建对象,那么就必须保证有无参数构造方法。

  3. 创建好的对象都存放在什么样的数据结构中?

    • Map<String , Object>
  4. Spring的配置文件名称不是固定的,想写啥写啥,但是要和下面代码中填入的字符串一致

      ApplicationContext context = new ClassPathXmlApplicationContext("Spring.xml");
    
  5. Spring的配置文件可以有多个

      ApplicationContext context = new ClassPathXmlApplicationContext("Spring1.xml","Spring2.xml");
    
  6. 配置文件中配置的类不一定是自定义的,也可以是JDK中的类

    <bean id="dataBean" class="java.util.Date"/>
    
  7. getBean() 方法调用时,如果指定的id不存在时,不会返回null而是会报错。

  8. getBean() 方法返回的类型时Object,如果访问子类特有属性和方法时,使用时必须向下转型

    或者是在getBean() 方法传入第二个参数,XXXX.class(指定要返回的类型)

    User user = ApplicationContext.getBean("userBean",User.class);
    
  9. 如果是从绝对路径调用spring配置文件,那么就需要

     ApplicationContext context = new FileSystemXmlApplicationContext("D:/Spring1.xml");
    
  10. 查阅源码可知,ApplicationContext有一个父接口是ListableBeanFactory,ListableBeanFactory的父接口是BeanFactory

    BeanFactory是Ioc容器的顶级接口

    Spring的IoC容器底层实际上使用了工厂模式。Spring底层的IoC是通过 XML解析+工厂模式+反射机制

  11. 实例化对象的时机:当以下代码执行时就会实例化对象

    new ClassPathXmlApplicationContext("spring6.xml");
    

启用Log4j2日志框架

  • 第一步:引入log4j2的依赖
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.19.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j2-impl</artifactId>
    <version>2.19.0</version>
</dependency>
  • 第二步:在类的根路径下提供log4j2配置文件(文件名固定为log4j2.xml,文件必须被放到类根路径下)
<?xml version="1.0" encoding="UTF-8"?>

<configeration>
    <loggers>
        <!-- level指定日志级别,从低到高的优先级:
 			ALL < TRACE < DEBUG < WARN < ERROR < FATAL < OFF 
		-->
    	<root level="DEBUG">
            <appender-ref ref="spring6log"/>
        </root>
    </loggers>
    
    <appenders>
         <!-- 输出日志信息到控制台 -->
    	<console name="spring6log" target="SYSTEM_OUT">
             <!-- 日志输出的格式 -->
        	<PatternLayout pattern="%d{yyyy-MM-dd HH:mm} [%t] %-3levle %logger{1024} -%msg%n"/>
        </console>
    </appenders>
</configeration>
  • 第三步:使用日志框架
Logger logger = LoggerFactory.getLogger(FirstSpringtest.class);//在哪个类里面就传什么参数
loggee.info("输入你想记录日志的内容")

依赖注入

构造注入

通过调用构造方法来给属性赋值,在bean标签里面添加constructor-arg标签

<!-- 构造注入 通过index指定参数 -->
<!-- 
	index 属性指定参数下标,第一个参数下标是0
 	ref 属性用于指定注入bean的id
-->
<constructor-arg index="0" ref="userDaoBean"/>

<!-- 构造注入 通过name指定参数 -->
<!-- name属性是参数的名字 -->
<constructor-arg name ref="userDaoBean"/>

<!-- 构造注入 spring自己做类型匹配 -->
<!-- 不指定下标也不指定参数名  -->
<constructor-arg name ref="userDaoBean"/>

set注入

set注入的话,必须提供一个set方法,spring会调用这个set方法,来给userDao赋值。

想要让spring调用对应的set方法,需要配置property标签

<!-- set注入 需要配置property标签 -->
<!-- 
	name属性是 set方法的方法名,去掉set,然后首字母变成小写 Eg: setAbcd()-----abcd
 	ref 属性用于指定注入bean的id
-->
<!-- set方法起名最好是按照规范,一般借助IDEA自动生成 -->
<proprety name="xxxx" ref="userDaoBean"/>

set注入专题

注入外部Bean

之前的几个例子就是外部注入:

外部bean的特点:bean定义在外面,然后在property标签中通过ref属性引入

注入内部Bean

在Bean标签中嵌套bean标签

<bean id="studentBean" class="com.winter.spring6.bean.studentBean">
	<property name="userDao">
    	<bean class="com.winter.spring6.bean.userBean"/>
    </property>
</bean>

注入简单类型

在property标签中 使用value属性给简单类型赋值

<!-- value 属性用于给简单类型赋值 -->
<proprety name="xxxx" value="123"/>

什么是简单类型?

使用IDEA查找Beanutils类,然后找到isSimpleValueType方法,查看里面的代码可知

  • 基本类型
  • 包装类
  • 枚举类
  • 字符串类型
  • 数字
  • 日期Date
  • 时间、时区Temporal
  • URI、URL
  • 语言local
  • Class

简单类型的应用:让spring去管理数据源

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » Spring6