• Spring bean注解配置(1)


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

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

    使用方法:

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

    @Component("标识符")  
    POJO类  

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

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

    1 <context:component-scan
    2         base-package=""
    3         resource-pattern="**/*.class"
    4         name-generator="org.springframework.context.annotation.AnnotationBeanNameGenerator"
    5         use-default-filters="true"
    6         annotation-config="true">
    7                 <context:include-filter type="aspectj" expression=""/>
    8                 <context:exclude-filter type="regex" expression=""/>
    9 </context:component-scan>   
    • 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表示过滤器表达式。

    下面为案例分析:

    1 package com.proc.bean;
    2 
    3 import org.springframework.stereotype.Component;
    4 
    5 @Component
    6 public class TestObject {
    7 
    8 }
    TestObject
    1 package com.proc.bean.Controller;
    2 
    3 import org.springframework.stereotype.Controller;
    4 
    5 @Controller
    6 public class UserController {
    7 
    8 }
    UserController
    1 package com.proc.bean.repository;
    2 
    3 public interface UserRepository {
    4     
    5     void save();
    6 }
    UserRepository
     1 package com.proc.bean.repository;
     2 
     3 import org.springframework.stereotype.Repository;
     4 
     5 @Repository("userRepository")
     6 public class UserRepositoryImps implements UserRepository{
     7 
     8     @Override
     9     public void save() {
    10         System.out.println("UserRepository save");
    11     }
    12 }
    UserRepositoryImps
    1 package com.proc.bean.service;
    2 
    3 import org.springframework.stereotype.Service;
    4 
    5 @Service
    6 public class UserService {
    7 
    8 }
    UserService

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

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

    测试输出

     1 ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
     2 
     3 TestObject testObject=(TestObject) ctx.getBean("testObject");
     4 System.out.println(testObject);
     5 
     6 UserController userController=(UserController) ctx.getBean("userController");
     7 System.out.println(userController);
     8 
     9 UserService userService=(UserService) ctx.getBean("userService");
    10 System.out.println(userService);
    11 
    12 UserRepository userRepository=(UserRepository)ctx.getBean("userRepository");
    13 System.out.println(userRepository);

    输出结果:

    com.proc.bean.TestObject@50d156
    com.proc.bean.Controller.UserController@61c7e3
    com.proc.bean.service.UserService@11d0846
    com.proc.bean.repository.UserRepositoryImps@1e4c80f

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

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

    这里是能够正确获取到com.proc.bean.Controller.UserController@61c7e3

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

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

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

    这里能够正确获取到

    com.proc.bean.TestObject@191f517
    com.proc.bean.controller.UserController@5965f2
    com.proc.bean.service.UserService@9bd883

    4、排除指定标识符的类

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

    这里排除了com.proc.bean.controller.UserController类型的,所以只能够正确得到

    com.proc.bean.TestObject@134517
    com.proc.bean.service.UserService@50d156
    com.proc.bean.repository.UserRepositoryImps@61c7e3

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

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

    这里只能够正确得到

    com.proc.bean.repository.UserRepositoryImps@1200884

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

    6、包含指定类型的类

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

    这里只能够正确得到

    com.proc.bean.TestObject@17f23d9

    最后提醒:

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

  • 相关阅读:
    常用Git代码托管服务分享
    .NET中操作IPicture、IPictureDisp
    Git学习笔记与IntelliJ IDEA整合
    螺旋队列问题
    杂题3道
    .NET 配置文件简单使用
    C++之Effective STL
    不容易理解的 lock 和 merge
    状态模式
    观察者模式
  • 原文地址:https://www.cnblogs.com/caoyc/p/5625920.html
Copyright © 2020-2023  润新知