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 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);
}
}