Spring基于注解+扫描管理bean

* @Component:将类标识为普通组件
* @Controller:将类标识为控制层组件
* @Service:将类标识为业务层组件
* @Repository:将类标识为持久层组件(dao层)
* (4个的效果都是一样,但为代码可读性,不能乱标)

 

context:exclude-filter:排除扫描
type:设置排除扫描的方式
type="annotation|assignable"
annotation:根据注解的类型进行排除
expression:需要设置排除的注解的全类名
assignable:根据类的类型进行排除
expression:需要设置排除的类的全类名

<context:component-scan base-package="com.javasm.spring" use-default-filters="false">        
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <context:exclude-filter type="assignable" expression="com.javasm.spring.controller.UserController"/>
</context:component-scan>



context:include-filter:包含扫描(只扫描,很少用
注意:需要在context:component-scan标签中设置
use-default-filters="true"(默认值)
(所设置的包下所有的类都需要扫描,此时可以使用排除扫描)
use-default-filters="false"
(所设置的包下所有类都不需要扫描,此时才可以使用包含扫描)

<context:component-scan base-package="com.javasm.spring"></context:component-scan>
    <context:component-scan base-package="com.javasm.spring" use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

 

* 通过注解+扫描所配置的的bean的id:
* 默认值为类的小驼峰,即类名的首字母为小写的结果

* 接口应该写他对应的实现类的小驼峰

首字母小写
UserController userController = ioc.getBean("userController",UserController.class);
接口id对应其实现类小驼峰
UserService userService = ioc.getBean("userServiceImpl",UserService.class);


* 可以通过标识组件的value属性值设置bean自定义id:
* @Controller("controller")
* 可通过这种方式来为其所配置的bean设置特定id(一般不用)

 

* @Autowired:实现自动装配功能的注解


* 1.@Autowired注解能标识的位置
* 1)标识在成员变量上,此时不需要设置成员变量的set方法(最常用)
* 2)标识在set方法上
* 3)标识在为当前成员变量赋值的有参构造上

* 2.@Autowired实现自动装配的原理
* 1)默认通过byType的方式,
* 在IOC容器中通过类型匹配某个bean为属性赋值


* 2)如果有多个类型匹配的bean,
* 此时会自动转化为byName的方式实现自动装配的效果
* 即将要赋值的属性的属性名作为bean的id匹配某个bean为属性赋值

* 3)若byType和byName的方式都无法实现自动装配
* 即IOC容器中有多个类型匹配的bean
* 且这些bean的id和要赋值的属性的属性名都不一致
* 此时抛出异常NoUniqueBeanDefinitionException


* 4)此时可以在要赋值的属性上,添加@Qualifier
* 通过该注解的value属性值,指定某个bean的id
* 将这个bean为属性赋值
* @Qualifier("userServiceImpl")

* 注意:若IOC容器中没有任何一个类型匹配的bean,
* 此时抛出异常:NoSuchBeanDefinitionException
* 在@Autowired注解中有个属性required,默认值为true
* 要求必须完成自动装配,可以@Autowired(required = false)
* 此时是能装配则装配,装配不了则使用属性默认值

posted @   别亦难  阅读(76)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示