一、关于Spring依赖注入的四个注释
1、@Service 一般给业务逻辑层加此注释
2、@Controller 一般给控制器层加此注释
3、@Repository 一般给数据库层即持久化层或Dao层加此注释
4、@Component 一般给不属于以上几层的加此注释
任何一个类上标上注解都能快速的将bean加入到容器中。
二、将组件加入到容器中的具体步骤
1、给需要添加的组件表上四个注解中的一个
2、依赖context名称空间,自动扫描加了注解的组件
context:component-scan :自动扫描组件
base-package:指定要扫描的基础包,把基础包下所有加了注解的类加入到容器中
3、使用注解一定要导入aop包,支持注解模式
加了注解的类,它的id默认为类名第一个字母小写如:类名:BookDao id:bookDao
作用域默认同样为单实例
在组件上可以通过添加@Scope(value="prototype")来改变组件为多实例
直接在四个注解的后面也可以自定义id 例如:@Service("bookSearch")
三、关于context名称空间的一些注意事项
exclude-filter :扫描时过滤一些不要的组件
include-filter :只扫描哪些要的组件,默认全部扫描进来
一定要禁用默认扫描规则,在componet-scan中使用use-default-filters="false"属性
type="annotation" 就是指定过滤规则,指按照注解 进行排除,在expression="注解的全类名" 在这里
规定哪些注解不扫描
type="assignable" 指定排除某个具体的类,按照类过滤,在expression="类的全类名"
后三种很少很少用到,了解就行,前两种要掌握
type="aspectj" 后来的aspectj表达式
type="custom" 自定义一个TypeFilter,自己写代码规定哪些使用
type="regex" 使用正则表达式
<context:component-scan base-package="com.feilonkji">
<!-- 指过滤掉注解为@Repository的组件 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
四、关于使用@Autowired自动装配注解的装配流程原理
使用@Autowired注解自动赋值
例如:
@Autowired
private BookService bookService;
1、先按照类型到容器中找到对应组件即:bookService = ioc.getBean(BookService.class);
1、找到就赋值
2、未找到就抛出异常
3、找到多个类型,即可能有子类或者父类
会继续按照变量名作为id继续匹配 例如:BookService变量名的id:bookService
1、找到就装配上
2、如果id还找不到,抛出异常
可以使用注解@Qualifier("id名");指定id名配置
可以使用@Autowired(required=false),指如果找不到对应的实例,就装配null,不再报异常
如果@Autowired使用在方法上,则方法上的参数都会自动注入值,同时方法在bean创建的时候自动运行
自动装配的注解:@Autowired @Resource @Inject 这三个注解都可以自动装配
@Autowired 最强大,是Spring中的注解
@Resource 是j2ee java的标准
区别:@Resource:扩展性很强,是java的标准,如果切换成另外一个容器框架@Resource可以继续使用,@Autowired不行