一:基于注解配置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接口

常用的则是annotationassinable;比如:(注意的是,如果使用了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的更多相关文章

  1. 基于注解的形式配置Bean

    基于注解的方式配置Bean:也就说我们在每个Bean的类名前面注解一下,Spring会自动帮我们扫描Bean放进IOC容器中 I基于注解的方式配置Bean(没有依赖关系的Bean)有两个步骤: 1组件 ...

  2. 基于注解的方式管理Bean

    --------------------siwuxie095                                 基于注解的方式管理 Bean         (一)准备         ...

  3. Spring4学习回顾之路11-AOP

    Srping的核心除了之前讲到的IOC/DI之外,还有一个AOP(Aspect Oriented Programming:面向切面编程):通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术 ...

  4. Spring4学习回顾之路03—XML配置Bean ,依赖注入的方式

    配置Bean的形式可以基于XML文件的方式,也可以基于注解的方式,而Bean的配置方式可以通过全类名(反射),通过工厂方式和FactoryBean. XML形式 <?xml version=&q ...

  5. Spring4学习回顾之路01—HelloWorld

    以前公司一直使用的是spring3.0,最近一段时间开始用了4.0,官网上都已经有了5.0,但是很多知识点已经忘了差不多了,趁现在项目不忙写写随笔,一来回顾自己的知识点,二来如果能帮助比我还小白的小白 ...

  6. Spring4学习回顾之路12-事务

    事务:事务就是一系列的动作,它们被当做一个单独的工作单元,这些动作要么全部完成,要么全部不起作用:事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性.事务的四个关键属性(ACI ...

  7. Spring4学习回顾之路04—引用其他Bean,集合数据注入,内部Bean

    引用其他Bean 组件应用程序的Bean经常需要相互协作以完成应用程序的功能,所以要求Bean能够相互访问,就必须在Bean配置文件中指定Bean的引用.在Bean的配置文件中可以用过<ref& ...

  8. Spring4学习回顾之路10-Spring4.x新特性:泛型依赖注入

    泛型依赖注入:Spring 4.x中可以为子类注入子类对应的泛型类型的成员变量的引用. 话语太过抽象,直接看代码案例,依次建立如下代码: User.java package com.lql.sprin ...

  9. Spring4学习回顾之路08- FactoryBean配置Bean

    建立Student.java package com.lql.srping04; /** * @author: lql * @date: 2019.10.28 * Description: */ pu ...

随机推荐

  1. GAN生成式对抗网络(四)——SRGAN超高分辨率图片重构

    论文pdf 地址:https://arxiv.org/pdf/1609.04802v1.pdf 我的实际效果 清晰度距离我的期待有距离. 颜色上面存在差距. 解决想法 增加一个颜色判别器.将颜色值反馈 ...

  2. 初次Java web项目的建立以及与数据库的连接

    题目要求: 1登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头:(1分) 2登录密码:要求显示“• ”或“*”表示输入位数,密码要求八位以上字母.数字组成.(1分) 3性别:要求用单 ...

  3. 自定义镜像mycentos

    1.编写 1).Hub默认CentOS镜像是什么情况 2).编写Dockerfile文件 2.构建 3.运行

  4. 线上bug或故障界定及填写规范

    [线上故障与线上Bug界定] 一.线上故障: 1.  故障参照公司规范稍做调整: a)         1级故障:资讯首页或主App首页无法打开:多条业务线同时不可用:超过15分钟: b)       ...

  5. v-if与v-show的区别?

    v-if的显示和隐藏实在dom里创建和消除dom节点 v-show是用css样式的display来控制dom节点的显示和隐藏 相比之下,v-show 就简单得多——不管初始条件是什么,元素总是会被渲染 ...

  6. VBA添加下拉菜单

    Sub createMenus() Dim cmdBar As CommandBar Dim cmdMenu As CommandBarPopup Dim cmdBtn As CommandBarBu ...

  7. exactly the kind of division of tasks that Gulp.js is built on

    The results are then passed to a reporter function that displays the results of the code analysis in ...

  8. android Vitamio Live 实时视频 记录

    Vitamio 下载地址: https://github.com/yixia/VitamioBundle/releases https://github.com/yixia/VitamioBundle ...

  9. java泛型中特殊符号的含义

    java泛型中的标记符含义:  E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类) K - Key(键) V - Value(值) N - Number ...

  10. Linux Shell列出网络中所有的活跃主机

    因为的的网段是 192.168.1.0/24 , 所以我只需遍历 192.168.1.1 到 192.168.1.255 之间的所有ip然后进行 ping 就可以了: test.sh: #!/bin/ ...