Spring04

Spring04

1.xml配置的自动注入

//创建了两个类
@Setter
@ToString
public class People {
    private Grade g;
}

public class Grade {
}

//传统方法注入
<bean id="grade" class="com.aaa.test.Grade"></bean>
<bean id="p1" class="com.aaa.test.People">
    <property name="g" ref="grade"></property>
</bean>
//实际开发中  会有大量的bean

    //所以出现了 自动注入
    <bean id="p1" class="com.aaa.test.People" autowire="byType"></bean>
    此时我们使用了autowire="byType"进行自动化配置  
        byType:根据类型注入 
            spring通过检查成员变量的类型 然后在bean中找到相同类型的
            但是如果有多个类型相同的bean就会有问题
        byName:根据名称注入
            spring通过检查成员变量的名字 然后再bean中找到相同id名的
            

2.根据注解配置

A 在spring的xml配置中开启注解配置

    <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       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
                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-beans.xsd"
       default-lazy-init="true">
<!--    开启注解注入-->
    <context:annotation-config></context:annotation-config>
<!--    包扫描 spring回去扫描配置包下面的类 注解进行自动注入-->
    <context:component-scan base-package="com.aaa.test"></context:component-scan>
    
</beans>
    
@Component
public class Grade {
}

@Setter
@ToString
@Component
public class People {
    @Autowired
    private Grade g;
}

3.@Component

@Setter
@ToString
@Component
public class People {
    @Autowired
    private Grade g;
}

当前注解添加到 类的上边 代表将当前类 注册到spring的核心容器下
    相当于在spring配置文件中配置了一个bean
    <bean class="com.aaa.test.People"></bean>
        将当前类的创建交给spring管理
而且 可以在注解中添加字符串类型的参数 代表着id

       在web项目中 java三层架构 视图层 服务层 数据持久层
        每一层的类都需要交给spring去管理
       但是没有语义化所以延申出来几个有语义化的注解 作用都是一样的
        @Controller 添加到控制层/视图层 表明当前类对象创建获取交给spring核心容器管理
        			一个控制层的类交给spring去管理
        @Service    一个业务层的类交给spring去管理
        @Repository 一个数据持久层的类交给spring去管理
        @Component  除了上述三个层之外的类 如果需要spring管理 可以使用这个注解
        
       底层都是@Component
        

4.@Autowired

@Autowired
    private Grade g;

添加了这个注解相当于 在配置文件中配置了自动注入
    
    
    当自动注入bean的时候 首先根据类型去匹配如果一个都匹配不到,
    则查看是否配置(required = true) 如果没有配置或者配置的是true,就代表必须注入,此时则抛出异常
    如果配置的是false,代表不是必须注入,此时如果找不到就不注入。
    如果正常匹配到一个 ,则按照类型正常注入。
    如果匹配到多个bean的类型都是同一类型。则根据当前变量的名字匹配对应的bean的名字。
    如果匹配到 则进行注入。如果匹配不到 则 抛出异常
    如果配置了@Qualifier("名字") 则根据@Qualifier("名字")的名字匹配对应的bean

5.@Resource注解

@Resource 相当于 @Autowired 都是用来自动注入
    
    @Resource是java自带的
    @Autowired 是spring中的
    
    @Resource装配顺序:
    如果同时指定了name和type,则从spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
    如果指定了name,则从上下文中查找名称 (id) 匹配的bean进行装配,找不到则抛出异常  
    如果指定了type,则从上下文中找到类型匹配的唯-bean进行装配,找不到或者找到多个,都会抛出异常
    如果既没有指定name,又没有指定type,则自动按照byName方式进行装配:如果没有匹配(名字没有一样的),则回退为一个原始类(相当于按照类型取查找一个实现类,如果按照类型取查找的实现类有多个 则抛出异常)
    

6.注解配置的作用域、懒加载、生命周期

@Scope作用域
@Lazy 懒加载
@Postconstruct 初始化函数
@PreDestroy 销毁函数    

7.配置类完成bean的配置管理

配置bean的方式
    A xml配置
    B 注解配置
    C 通过配置类
    
    创建一个配置类加上@Configuration注解
    在里边方法中加上一个@Bean注解
    相当于我们配置了一个bean 返回值类型就是数据类型
    对象创建交给我们自己去创建 

8.Spring中的测试函数

A 导入测试包
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>6.0.7</version>
    </dependency>
B 在测试类中添加注解
    @RunWith(SpringJUnit4ClassRunner.class)
	@ContextConfiguration("classpath:spring.xml")
	public class JavaTest { 
    	
        
    }



@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring.xml")
public class JavaTest {
    @Autowired
    private ApplicationContext context;
    @Autowired
    private People p1;

    @Test
    public void test(){
        People bean = context.getBean(People.class);
        System.out.println(bean);
    }

    @Test
    public void test1(){
        System.out.println(p1);
    }
}

你可能感兴趣的:(Java学习,java,spring)