目录
6、Bean的自动装配
- 自动装配是spring满足bean依赖的一种方式
- spring会在上下文中自动寻找,并自动给bean装配属性
在spring中有三种装配的方式
- 在xml中显式的配置
- 在java中显式的配置
- 隐式的自动装配bean⭐
6.1、环境
<bean id="cat" class="com.bin.pojo.Cat"/>
<bean id="dog" class="com.bin.pojo.Dog"/>
<bean id="person" class="com.bin.pojo.Person">
<property name="name" value="陈"/>
<property name="cat" ref="cat"/>
<property name="dog" ref="dog"/>
</bean>
6.2、XML配置自动装配
-
byName自动装配
<!--自动在容器上下文查找和对象set方法名后面的值对应的bean id--> <bean id="cat" class="com.bin.pojo.Cat"/> <bean id="dog" class="com.bin.pojo.Dog"/> <bean id="person" class="com.bin.pojo.Person" autowire="byName"> <property name="name" value="陈"/> </bean>
-
byType自动装配
<!--自动在容器上下文查找和对象set方法的参数类型对应的bean,且被引用的bean可不写id--> <bean class="com.bin.pojo.Cat"/> <bean class="com.bin.pojo.Dog"/> <bean id="person" class="com.bin.pojo.Person" autowire="byType"> <property name="name" value="陈"/> </bean>
小结:
- byName,需要保证bean的id唯一,并且要与注入的set方法名set的后面值一致
- 大小写遵循驼峰命名法,若开头字母连续大写,那这些字母不需要转小写(完全照写)
- 若开头字母大写第二个字母小写,则首字母改成小写,后续字母大小写不变
- byType,想要保住所有bean的class唯一,并且bean要和set方法参数的类型要一致
6.3、使用注解实现自动装配
-
导入约束
- context约束
-
配置注解的支持
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 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/cotext/spring-context.xsd"> <!--⭐开启注解支持--> <context:annotation-config/> </beans>
@Autowired⭐
- 默认通过byType进行装配
- 在属性或者set方法上使用
- 可以不写set方法,前提ICO(spring)容器中存在符合的bean
- ICO容器中存在多个相同类型的bean时,通过byName进行装配,默认匹配与属性名相同的bean id
- 若需要通过byName自动装配与属性名不同的bean id需要使用@Qualifier(value = “”)注解
自动装配中查找符合的bean:
- 在使用@Autowired时,首先在容器中查询对应类型的bean
- 如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据(byType)
- 如果查询的结果不止一个,那么@Autowired会根据名称来查找(byName)
- 如果查询的结果为空,那么会抛出异常。解决方法时,使用required=false(但可能会引起空指针)
- 多个同类型的bean时,可以和@Qualifier(value = “”)注解搭配使用,可以匹配自定义bean的id
public class Person {
private String name;
//表示自动装配没找到bean对象时不报错,且赋值为null
@Autowired(required = false)
private Cat cat;
@Autowired
//和@Autowired配合使用,可以指定匹配bean的id
@Qualifier(value = "dog1")
private Dog dog;
}
@nullable:可以标注在方法、字段、参数之上,表示对应的值可以为空
@Resource
public class Person {
private String name;
//如果required属性定义为false,说明这个对象可以为null
@Resource(name = "cat11")
private Cat cat;
@Resource
private Dog dog;
}
7、使用注解开发
7.1、xml文件
需要开启注解支持和组件扫描器
组件扫描器:指定注解所在的包名,让框架找到注解,按照注解的功能,创建对象,赋值属性
<!--声明组件扫描器(context:component),指定包下的注解就会生效-->
<!--base-package:指定注解在项目中的包名,框架会扫描这个包和子包中所有类的注解,按照注解的功能,创建对象,赋值属性。-->
<context:component-scan base-package="com.bin"/>
<!--开启注解支持-->
<context:annotation-config/>
7.2、属性如何注入
@Value(" ")注解可以给属性赋值
@Component注解是创建类的对象
- bean 的id是value值,若没有赋值默认是类名首字母小写(遵循驼峰命名法)
//@Component创建类的对象,默认单列
@Component
public class User {
@Value("chen")
private String name;
}
7.3、衍生的注解
@Component有几个衍生注解,在web开发中会按照mvc三层架构分层
- @Repository dao层
- @Service service层
- @Controller web层
与@Component都是创建对象的注解,多了一些特定的功能
7.4、自动装配注解
-
@Autowired spring提供自动装配
-
默认byType
-
指定与属性名不同的bean id时,需要使用@Qualifier(value = " ")注解
-
-
@Resource jdk提供的自动装配
- 可以给name赋值,指向指定id的bean
7.5、作用域的注解
使用@Scope(" ")注解设置作用域的范围
@Component
@Scope("prototype") //设置作用域的范围
public class User {
@Value("chen")
private String name;
}
7.6、小结
- 注解
- 优点:方便、直观、高效(代码少,没有配置文件的书写那么复杂)
- 缺点:以硬编码的方式写入到 Java 代码中,修改时需要重新编译代码的
- xml
- 优点:配置和代码是分离的在 xml 中做修改,无需编译代码,只需重启服务器即可将新的配置加载
- 缺点是:编写麻烦,效率低,大型项目过于复杂
8、使用java的方式配置spring
可以不使用spring的xml配置,用java的形式来实现(配置用java类实现)
xml配置使用第三个context类,java配置类使用第一个context类
8.1、使用配置类+bean的方式创建对象
- ChenConfig这个类就相当于xml配置文件
- 配置类中的方法加上@bean注解就是配置类中的bean,其中方法名为id,返回类型为class
@Configuration
public class ChenConfig {
@Bean
public User abcuser(){
return new User();
}
}
8.2、使用包扫描+配置类的方式创建对象
- ChenConfig这个类就相当于xml配置文件
- @ComponentScan(“com.bin.pojo”)扫描包内的类以及子包中的类
- 在别的类上加上@Component()注解,该类就可以被创建对象
@Configuration
@ComponentScan("com.bin.pojo")
public class ChenConfig {}
@Component()
public class User {
@Value("chen123234")
private String name;
}
8.3、引入其他配置类
- 使用注解@Import(BinConfig.class)引入其他的配置类
@Configuration
@Import(BinConfig.class)
public class ChenConfig {}