专栏首页浩CodingSpring bean注解配置(1)—— @Component

Spring bean注解配置(1)—— @Component

Spring自带的@Component注解及扩展@Repository@Service@Controller,如图:

在使用注解方式配置bean时,需要引进一个包:

使用教程

1、为需要使用注解方式的类添加注解标记。

@Component("名称")  
public class Test {
}

在类上使用@Component注解,表示该类定义为Spring管理Bean,使用默认value(可选)属性表示Bean标识符如果不指定标识符,默认为首字母小写类名。例如类Test的标识符为test。

2、在xml中配置自动扫描策略

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
   <!-- 指定需要扫描的包,使注解生效 -->
    <context:component-scan
            base-package=""
            resource-pattern="**/*.class"
            name-generator="org.springframework.context.annotation.AnnotationBeanNameGenerator"
            use-default-filters="true"
            annotation-config="true">
            <context:include-filter type="aspectj" expression=""/>
            <context:exclude-filter type="regex" expression=""/>
    </context:component-scan>
</beans>

base-package:表示扫描注解类的开始位置,即将在指定的包中扫描,其他包中的注解类将不被扫描,默认将扫描所有类路径

resource-pattern:表示扫描注解类的后缀匹配模式,即“base-package+resource-pattern”将组成匹配模式用于匹配类路径中的组件,默认后缀为“**/*.class”,即指定包下的所有以.class结尾的类文件

name-generator:默认情况下的Bean标识符生成策略,默认是AnnotationBeanNameGenerator,其将生成以小写开头的类名(不包括包名);可以自定义自己的标识符生成策略。

use-default-filters:默认为true表示过滤@Component、@ManagedBean、@Named注解的类,如果改为false默认将不过滤这些默认的注解来定义Bean,即这些注解类不能被过滤到,即不能通过这些注解进行Bean定义。

annotation-config:表示是否自动支持注解实现Bean依赖注入,默认支持,如果设置为false,将关闭支持注解的依赖注入,需要通过<context:annotation-config/>开启。

<context:include-filter>:表示过滤到的类将被注册为Spring管理Bean。需要配合use-default-filters使用。

<context:exclude-filter>:表示过滤到的类将不被注册为Spring管理Bean,它比<context:include-filter>具有更高优先级。

type表示过滤器类型,目前支持注解类型、类类型、正则表达式、aspectj表达式过滤器,当然也可以自定义自己的过滤器,实现org.springframework.core.type.filter.TypeFilter即可。

expression:表示过滤器表达式

实例分析

@Component()
/**相当于@Component("annotationUser")或@Component(value = "annotationUser"),annotationUser为Bean的id,默认为首字母小写的类名**/
public class AnnotationUser {
  @Value("chenheng")//只注入了简单的值,复杂值的注入目前使用该方式还解决不了
  private String uname;
}
@Controller
public class TestController {
  @Autowired
  //@Autowired 自动按照Bean类型(本例子中就是TestService类型)装配,注入给testService变量,下章详细讲解
  private TestService testService;
  public void save() {
    testService.save();
    System.out.println("testController save");
  }
}
public interface TestService {
  public void save();
}
@Service("testService")//相当于@Service
public class TestSeviceImpl implements TestService{
  @Resource(name="testDao")
  /**相当于@Autowired,@Autowired默认按照Bean类型装配**/
  private TestDao testDao;
  @Override
  public void save() {
    testDao.save();
    System.out.println("testService save");
  }
}

需要在配置文件中配置注解通过base-package指定扫描指定包及其子包下所有类,注解配置方式如下:

<!-- 使用context命名空间,通过Spring扫描指定包下所有Bean的实现类,进行注解解析 -->
  <context:component-scan base-package="annotation"/>

测试输出:

import annotation.controller.TestController;
public class TestMoreAnnotation {
  public static void main(String[] args) {
    ApplicationContext appCon = new ClassPathXmlApplicationContext("annotationContext.xml");
    TestController testcon = (TestController)appCon.getBean("testController"); 
    testcon.save();
  }
}

1、在xml中配置,通过base-package指定扫描指定包及其子包下所有类

<context:component-scan base-package="com.proc.bean"></context:component-scan>

2、指定resource-pattern:资源匹配,只扫描controller包下面的所有类

<context:component-scan base-package="com.proc.bean" resource-pattern="controller/*.class">
</context:component-scan>

3、 排除使用指定注解标签的类

<context:component-scan base-package="com.proc.bean">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>

type:选择类型 annotation:注解标签、assignable:类名方式

4、排除指定标识符的类

<context:component-scan base-package="com.proc.bean">
    <context:exclude-filter type="assignable" expression="com.proc.bean.controller.UserController"/>
</context:component-scan>

这里排除了com.proc.bean.controller.UserController类型的。

5、包含指定注解标记的类

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

在使用include-filter是需要配合use-default-filters="false",让自动扫描注解不使用默认的filter,而是使用我们指定的filter,否则将无效。

6、包含指定类型的类

<context:component-scan base-package="com.proc.bean" use-default-filters="false">
   <context:include-filter type="assignable" expression="com.proc.bean.TestObject"/>
</context:component-scan>

<context:include-filter/>和<context-exclude-filter/>标签可以使用多个。

本文分享自微信公众号 - 浩Coding(gh_c4a2e63d2ca7),作者:浩

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 码云使用教程--用eclipse上传和下载代码

    1.先要在码云上面创建一个空的项目:然后填个项目名称就行了,项目介绍可填可不填。点击加号创建项目,如图:

    浩Coding
  • 2019Java面试宝典数据库篇 -- MySQL

    SQL 语言不同于其他编程语言的最明显特征是处理代码的顺序。在大多数据库语言中,代码按编码顺序被处理。但在 SQL 语句中,第一个被处理的子句是 FROM,而不...

    浩Coding
  • Linux命令之find——查找命令

    本篇教程较长,所有在教程前面先放几个实例,有需要的直接看实例就行,想深入了解的小伙伴可以继续往下看:

    浩Coding
  • Canvas系列(7):形变

    CSS3中有一个很重要的点,就是形变。他分为移动,缩放、旋转和倾斜。在Canvas中,形变都是基于坐标做的,所以,并没有直接的API支持倾斜,其它几种都是有独立...

    kai666666
  • Canvas 基本绘制(下)

    HTML5学堂:在前一篇文章《Canvas 基本绘制(上)》当中,我们为大家介绍了Canvas的基本知识——什么是Canvas、如何使用Canvas进行图像的绘...

    HTML5学堂
  • HTML5动态时钟

    felix
  • canvas 实现自定义钟表

    参考博客:https://www.cnblogs.com/liugang-vip/p/3557983.html

    acoolgiser
  • HTML5之Canvas

    document.createElement("canvas").getContext("2d");

    疯狂的技术宅
  • Canvas绘图——2d表

    初学JavaScript,用Canvas画一个表。主要用到昨天学的间歇调用(setInterval)。 方法和属性介绍 context.beginPath()、...

    刘开心_1266679
  • Canvas系列(3):路径与状态

    前两章我们学的是基本图形的描边和填充,学完基本图形绘制以后就会绕不过2个概念就是路径和状态,本章我们看看这一块的内容。

    kai666666

扫码关注云+社区

领取腾讯云代金券