10、IOC 操作 Bean 管理(基于注解方式)
<!--开启组件扫描
1 如果扫描多个包,多个包使用逗号隔开
2 扫描包上层目录
-->
<context:component-scan base-package="com.leizi"></context:component-scan>
<!--开启注解支持-->
<context:annotation-config/>
@Autowired
直接在属性上使用即可,也可以在set方法上使用。
使用@Autowired可以不用编写Set方法,前提是这个自动装配的属性在IoC容器中存在,且符合名字byName自动装配。
@Nullable
字段标记了这个注解,说明这个字段可以为null
扩展:
@Autowired(required=false) 如果显示定义了Autowired的required属性为false,说明这个对象可以为null,否则不允许为空
@Autowired(required=false)
private Cat cat;
如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注解@Autowired完成的时候,我们可以使用@Qualifier(value="xxx")去配置@Autowired的使用,指定一个唯一的bean对象注入
public Class Perple {
@Autowired
@Qualifier(value="cat1")
private Cat cat;
}
@Resource注解(java提供的自动装配注解)
public Class People {
@Resource(name="cat2")
private Cat cat;
@Resource
private Dog dog;
}
小结:
@Resource 和 @Autowired 的区别:
都是用来自动装配的,都可以放在属性字段上
通常情况下@Autowired是通过byType的方法注入的(而且必须要求这个对象存在),可是在多个实现类的时候,byType的方式不再是唯一,而需要通过byName的方式来注入,
而这个name默认就是根据变量名来的。通过@Qualifier注解来指明使用哪一个实现类,实际上也是通过byName的方式实现。到底使用byType还是byName是有优先级的。优先用byType,而后是byName。
@Autowried是Spring2.5定义的自动装配的注解,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 使用 @Autowired的使用来消除 set ,get方法。
@Autowired 标注在方法上表示当前方法的自定义参数从容器中赋值,ioc容器默认赋值时,需要调用无参构造器后,再进行默认赋值,如果当前类只有一个有参的构造器,则@Autwried可以省略,并且该构造器的参数也默认从ioc容器中获取。
@Resource 默认通过byName 的方式实现,如果找不到名字,则通过byType实现,如果两个都找不到的情况下,就报错。
注解@Scope("singleton") 表明范围,例如单例
@component
@Scope("singleton")
public class User{
}
JavaConfig实现配置:
配置类取代了xml配置文件:
package com.stt.config;
import com.stt.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
// 被spring容器托管,注册到容器中,内部也是一个@Component
@Configuration // 代表这个一个配置类,相当于applicationContext.xml配置文件
@ComponentScan("com.stt.pojo") // 扫描包
@Import(MyConfig2.class) // 导入其他配置类
public class MyConfig {
// 注册一个Bean,相当于xml配置文件中的bean标签
// 这个方法的名字,就相当于bean标签中的id属性
// 这个方法的返回值,就相当于bean标签中的class属性
@Bean
public User user(){
return new User(); // 返回要注入的对象
}
}