spring中bean的装配指:将bean资源加入到IOC容器实例化;
spring中bean的注入指:将IOC中中的实例注入(这里就先不谈是否被代理了)
装配的方式一般分为两种:显示装配跟隐式装配。
显示装配:1.Java Config形式(@Configuration及@Bean)
2.基于xml配置的Bean
隐式装配(扫面组件+自动装配):
1.基于注解的(比如@ComponentScan和@Component和@Service以及mvc的注解、@MapperScan)
2.自动装配主要满足依赖之间的关系,比如@Autowired@Resource
注入方式:
1.set注入(基于xml的)
//set注入,基本数据类型
<bean id="user" class="com.demo.User">
<property name="sex" value="男"/>
<property name="age" value="26"/>
<bean>
//引用类型
<bean id="userService" class="com.demo.UserService">
<property name="user" ref="user"/>
<bean>
//复杂类型
<bean id="userService" class="com.demo.UserService">
<property name="list">
<list>
<value>hhh</value>
<value>ccc</value>
</list>
</property>
<bean>
基于java config的
@Configuration
public class BeanConfig{
//方法名就是bean的id
@Bean
public User createUser(){
User user = new User();
user.setSex("nan");
return user;
}
}
2.构造器注入
<bean id="user" class="com.demo.User">
<property name="sex" value="男"/>
</bean>
<bean id="userService" class="com.demo.UserService">
<constructor-arg ref="user">
<constructor-arg index="x" type="x">
//index用来区别构造函数有多个参数时的位置
//type用来描述参数类型
</bean>
public class User{
private String sex;
public void setSex(String sex){
this.sex = sex;
}
}
public class UserService{
private User user;
public UserService(User user){
this.user = user;
}
}
基于java config的
@Configuration
public class BeanConfig{
@Bean
public User create(){
User user = new User(new XXX);
return user;
}
3.属性注入(严格来讲set注入,构造器注入也算属性注入的一种)
@Component
public class User{
@Value("123")
private String name;
public String getName(){
return name;
}
}
4.自动注入(@ComponentScan+@Autowired)
其实为啥说他自动,因为他不需要设置属性值,且通过组件扫描实现注入
@Service
public class UserServiceImp{
@Autowired(required=false)
private UserService service;
....
}
基于自动注入的自动装配类型总共有五种: (相当于筛选IOC容器里符合条件的Bean实例)
1.no 表示不做处理,不使用自动装配功能
2.byName 将属性名跟组件名称符合匹配的注入进来
3.byType 将 属性类型跟组件类型匹配,若查询不到则为null,若查询的对象不止一个则以byName匹配,匹配不到也为null
4.constructor: 与byType类似是根据类型进行自动装配,但是要求待装配的bean有相应的构造函数
5.autodetect:利用Spring的自省机制判断使用byType或是constructor装配
@Autowired默认byType @Resource(不是spring的注解,但spring支持)默认是byName |