Spring4学习回顾之路09-基于注解的方式配置bean
一:基于注解配置Bean
首先介绍下组件扫描(component scanning): Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件。
包括:
-@Component:基本注解,标识一个受Spring管理的组件
-@Respository:标识持久层组件
-@Service:标识服务层/业务层组件
-@Controller:标识表现层/控制层组件
实际上,上述四个注解,除了名字不同之外,功能都是一样的,换一句话说,能用@Respository也能用其他三个组件,只是换个名称而已!
对于扫描到的组件,Spring有默认的命名策略,“使用非限定类名,第一个字母小写”,也可以在注解中通过value属性值标识组件名称。
在组件类上使用了上述注解后,还需要在Spring的配置文件中开启组件扫描“<context:component-scan>”,比如:
<context:component-scan base-package="com.lql.srping04"></context:component-scan>
base-package:指定一个需要扫描的基类包,Spring容器将会扫描这个基类包里面以及其子包的所有类,如需要扫描多个包,可以使用逗号隔开。
案例:建立一个空的类Student.java,加上注解@Component
package com.lql.srping04; import org.springframework.stereotype.Component; /**
* @author: lql
* @date: 2019.10.28
* Description:
*/
@Component
public class Student { }
测试类:(配置文件必须开始组件扫描)
package com.lql.srping04; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /**
* @author: lql
* @date: 2019.10.28
* Description:
*/
public class StudetnTest {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("spring04.xml");
Student student = app.getBean("student", Student.class);
System.out.println(student);
}
}
打印结果:com.lql.srping04.Student@1563da5
说明是没有问题的!当组件扫描的包过多,只需要指定单独的包的时候,需要在“<context:component-scan>”使用resource-pattern:如:
<context:component-scan base-package="com.lql.srping04" resource-pattern="demo/*.class"></context:component-scan>
resource-pattern就是指定扫描的资源。当然除此之外还有子节点“<context:include-filter>”和子节点“<context:exclude-filter>”:
<context:include-filter>:表示要包含的目标类
<context:exclude-filter>:表示要排除的目标类
<context:component-scan>下可以拥有若干个<context:include-filter>和若干个<context:exclude-filter>子节点。
<context:include-filter>和<context:exclude-filter>支持多种类型的过滤表达式: -annotation: 示例:com.lql.XxxAnnotation,所有标注了XxxAnnotation的类,该类型采用目标类是否标注了某个注解进行过滤
-assinable: 示例:com.lql.XxxService,所有继承或扩展了XxxService的类,该类型采用目标类是否继承或扩展某个特定类进行过滤
-aspectj: 示例:com.lql..*Service+,所有类名以SErvice结束的类以及继承或扩展它们的类,该类型采用AspectJ表达式进行过滤
-regex: 示例:com.\lql\.anno\.*,所有com.lql.anno包下的类,该类型采用正则表达式根据类的类名进行过滤
-custom: 示例:com.lql.XxxTypeFilter,采用XxxTypeFilter通过代码的方式定义过滤规则,该类型必须实现org.springframework.core.type.TypeFilter接口
常用的则是annotation和assinable;比如:(注意的是,如果使用了include-filter,必须将use-default-filters设置为false,取消默认的过滤,采用自己的过滤方式)
使用annotation
<context:component-scan base-package="com.lql.srping04" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Component"></context:include-filter>
<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"></context:include-filter>
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:exclude-filter>
</context:component-scan>
使用assinable
<context:component-scan base-package="com.lql.srping04">
<context:exclude-filter type="assignable" expression="com.lql.srping04.Student"></context:exclude-filter>
</context:component-scan>
效果是一样的.
二:基于注解装配Bean的属性
<context:component-scan>元素还会自动注册AutowiredAnnotationBeanPostPRocessor实例,该实例可以自动装配具有@Autowired,@Resource,@inject注解的属性!
使用@autowired自动装配Bean:@Autowired注解自动装配具有兼容类型的单个Bean属性
构造器,普通字段(即使是非public),一切具有参数的方法都可以应用@autowired注解!默认情况下,所有使用@Autowired注解的属性都需要被设置,当Spring找不到匹配的Bean装配属性时就会抛出异常,若某一属性允许不被设置,可以设置@Autowired注解的required的属性为false。比如:
@Autowired(required = false)
private Student student;
如果IOC容器里有多个相同的bean,如果使用@autowired的话会报错,("org.springframework.beans.factory.NoUniqueBeanDefinitionException");这时有两种方式
①:指定bean的名称与属性名一直,比如组件上@Service(value = “student”),这个“student”和属性的student对应:
②:使用@Qualifier注解指定要使用的那个bean;如下
@Autowired
@Qualifier("student")
private Student student;
除@Autowired之外,还可以使用@Resource或者@Inject自动装配Bean,@Inject和@Autowired注解一样也是按类型匹配注入的Bean,但是没有reqired属性,@Resource注解要求提供一个Bean名称的属性,若该属性为空,则自动采用标注处的变量或者方法名作为Bean的名称。所以建议使用@autowired!
@Autowired的工作机制
首先使用byType的方式进行装配,如果能唯一匹配,则进行装配;如果匹配到多个兼容类型的Bean时,还会使用byName的方式进行唯一确定,如果能唯一确定则进行装配,如果不能唯一确定则装配失败。
Spring4学习回顾之路09-基于注解的方式配置bean的更多相关文章
- 基于注解的形式配置Bean
		
基于注解的方式配置Bean:也就说我们在每个Bean的类名前面注解一下,Spring会自动帮我们扫描Bean放进IOC容器中 I基于注解的方式配置Bean(没有依赖关系的Bean)有两个步骤: 1组件 ...
 - 基于注解的方式管理Bean
		
--------------------siwuxie095 基于注解的方式管理 Bean (一)准备 ...
 - Spring4学习回顾之路11-AOP
		
Srping的核心除了之前讲到的IOC/DI之外,还有一个AOP(Aspect Oriented Programming:面向切面编程):通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术 ...
 - Spring4学习回顾之路03—XML配置Bean ,依赖注入的方式
		
配置Bean的形式可以基于XML文件的方式,也可以基于注解的方式,而Bean的配置方式可以通过全类名(反射),通过工厂方式和FactoryBean. XML形式 <?xml version=&q ...
 - Spring4学习回顾之路01—HelloWorld
		
以前公司一直使用的是spring3.0,最近一段时间开始用了4.0,官网上都已经有了5.0,但是很多知识点已经忘了差不多了,趁现在项目不忙写写随笔,一来回顾自己的知识点,二来如果能帮助比我还小白的小白 ...
 - Spring4学习回顾之路12-事务
		
事务:事务就是一系列的动作,它们被当做一个单独的工作单元,这些动作要么全部完成,要么全部不起作用:事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性.事务的四个关键属性(ACI ...
 - Spring4学习回顾之路04—引用其他Bean,集合数据注入,内部Bean
		
引用其他Bean 组件应用程序的Bean经常需要相互协作以完成应用程序的功能,所以要求Bean能够相互访问,就必须在Bean配置文件中指定Bean的引用.在Bean的配置文件中可以用过<ref& ...
 - Spring4学习回顾之路10-Spring4.x新特性:泛型依赖注入
		
泛型依赖注入:Spring 4.x中可以为子类注入子类对应的泛型类型的成员变量的引用. 话语太过抽象,直接看代码案例,依次建立如下代码: User.java package com.lql.sprin ...
 - Spring4学习回顾之路08- FactoryBean配置Bean
		
建立Student.java package com.lql.srping04; /** * @author: lql * @date: 2019.10.28 * Description: */ pu ...
 
随机推荐
- PostMan的详细介绍
			
无论是接口调试还是接口测试,postman都算的上很优秀的工具,好多接口测试平台.接口测试工具框架的设计也都能看到postman的影子,我们真正了解了这款工具,才可以在这个基础上进行自己的设计和改造. ...
 - c语言 内存,可执行文件
			
c语言代码与可执行文件的映射关系 函数中的代码 存储在.text 段中 已初始化的全局变量 存储在.data段 未初始化的全局变量 存储在.bss段中 程序类型 映射到file header中 面试题 ...
 - Zhejiang Provincial Collegiate Programming Contest + ZOJ Monthly
			
题目链接:https://vjudge.net/contest/152802#overview. 前五题以前做过了.不过还是没能全A= =. 前三题水题,略过. 第四题是找规律,暴力打表找一下循环节即 ...
 - iptables 查看对应规则及端口号
			
iptables -L -n --line-number
 - 使用 docker 部署 typecho 的 nginx 配置文件
			
savokiss.com.conf server { listen ssl http2 reuseport; server_name savokiss.com www.savokiss.com; ro ...
 - Jmeter Web 性能测试入门 (七):Performance 测试中踩过 Jmeter 的坑
			
脚本运行的过程中,大量request抛error,但没有地方能够查看request是因为什么error的. 原因:Jmeter默认禁掉了运行过程中每个request的具体response信息收集,只保 ...
 - iTerm 2打造ssh完美连接Linux服务器快捷方法
			
iTerm 2打造ssh完美连接Linux服务器快捷方法 2019年05月02日 10:40:19 Mars0908 阅读数 213更多 个人分类: Mac下开发 版权声明:本文为博主原创文章,遵 ...
 - smarty 对数据库的简单操作。
			
smarty简单配置 -------------------------------------smarty_inc.php-------------------------------------- ...
 - kafka简单学习----遇到的问题
			
kafka启动消费者时总是显示disconnected.这是因为 producer client采用2.10.1.0版本,而kafka集群是2.10.0.0版本,不能兼容 解决方法如下:
 - js 匿名函数 js-函数定义方法
			
1.任何函数都是有返回值的,没有返回值的,在某些语言里称之为过程例如PL/SQL 2.js中的函数如果没有return 关键字指明给出的返回值,那么当调用完函数后,会返回“undefined" ...