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)
* 此时是能装配则装配,装配不了则使用属性默认值
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了