zoukankan      html  css  js  c++  java
  • 5.spring:注解配置 Bean

    在classpath中扫描组件

    组键扫描:能够从classpath下自动扫描,侦测和实例化具有特定注解的组件
    特定的组件包括:
    ->@Componment:基于注解,标识一个受Spring管理的组键
    ->@Respository:标识持久层组件
    ->@Service:标识服务层
    ->@controller:标识表现层组件
    对于扫描到的组件,Spring有默认的命名策略,使用非限定类名,第一个字母小写,也可以通过注解中value属性值标识组建的名称

    在classpath中扫描组键
    当在组键类中使用了特定的注解后,还需要再Spring的配置中声明<context:componment-scan>
    ->base-packge属性是指定一个需要扫描的基类包,Spring容器将会扫描这个基类包里及其他子类包中的所有类
    ->当需要扫描多个包时,可以使用逗号分隔
    ->如果仅希望扫描特定类而非集包下的所有类,可使用resource-pattren属性过滤特定的类

    通常情况下我们在创建spring项目的时候在xml配置文件中都会配置这个标签,配置完这个标签后,spring就会去自动

    扫描base-package对应的路径或者该路径的子包下面的java文件,
    如果扫描到文件中带有@Service,@Component,@Repository,@Controller等这些注解的类,则把这些类注册为bean
    注:在注解后加上例如@Component(value=”abc”)时,注册的这个类的bean的id就是abc.

    TestObject.java
    @Component
    public class TestObject {
    //@Componment:基于注解,标识一个受Spring管理的组键
    }
    UserController.java
    @Controller
    public class UserController {
        //建立关联关系
        @Autowired
        private UserService userService;
        
        public void execute() {
            System.out.println("UserController execute...");
            userService.add();
        }
    }

     UserRepository.java

    public interface UserRepository {
        void save();
    }

     UserRepositoryImpl.java

    @Repository("userRepository")
    public class UserRepositoryImpl implements UserRepository {
        @Override
        public void save() {
            System.out.println("UserRepository  save...");
        }
    }
    UserService.java
    @Service
    public class UserService {    
        @Autowired
        private UserRepository userRepository;
    public void add() { // TODO Auto-generated method stub System.out.println("UserService add..."); userRepository.save(); } }

    applicationContext.xml

    <!-- 指定IOC容器扫描的包 -->
    <!-- 下面的引入文件,没有进入IOC容器的立马进入IOC容器,有S的标志 -->
    <!-- 扫描这个包以及它的子包 -->
    <context:component-scan base-package="com.MrChengsb.Annotations" ></context:component-scan>
    
    <!-- 
        只扫描子包中这个包里的类
        resource-pattern="repository/*.class"
        
        不包含...
        指定排除那些表达式的组键
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
     -->
    
    <!--  
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
    -->
        
    <!--
         和 context:component-scan 中的 use-default-filters="false" 进行搭配才可以只包括,就是只有包含的这个
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
    -->
    <!--
       只包含
       use-default-filters="false" 共同使用 <context:include-filter type="assignable" expression="com.MrChengsb.Annotations.repository.UserRepository"/> -->
    <!-- 不包含这个接口以及它的实现类 <context:exclude-filter type="assignable" expression="com.MrChengsb.Annotations.repository.UserRepository"/> -->

    测试以及相关注释:

    public static void main(String[] args) {
            
            ApplicationContext ctx = new ClassPathXmlApplicationContext("Annotations.xml");
            
            //没有设立关联关系的
    //        TestObject test = (TestObject) ctx.getBean("testObject");
    //        System.out.println(test);
    //        
    //        UserController uc = (UserController) ctx.getBean("userController");
    //        System.out.println(uc);
    //        
    //        UserRepositoryImpl urp = (UserRepositoryImpl) ctx.getBean("userRepository");
    //        System.out.println(urp);
    //        
    //        UserService use = (UserService) ctx.getBean("userService");
    //        System.out.println(use);
    //        
            
            
            //设立关联关系的
    //        TestObject test = (TestObject) ctx.getBean("testObject");
    //        System.out.println(test);
            
            UserController uc = (UserController) ctx.getBean("userController");
            System.out.println(uc);
            uc.execute();
            
    //        UserRepositoryImpl urp = (UserRepositoryImpl) ctx.getBean("userRepository");
    //        System.out.println(urp);
    //        
    //        UserService use = (UserService) ctx.getBean("userService");
    //        System.out.println(use);
            
            
            
            //没建立Bean之家的引用关系
    //        com.MrChengsb.Annotations.controller.UserController@2925bf5bException in thread "main" 
    //        UserController execute...
    //        java.lang.NullPointerException
    //            at com.MrChengsb.Annotations.controller.UserController.execute(UserController.java:18)
    //            at com.MrChengsb.Annotations.main.main(main.java:37) 
        }

     测试代码省略.......

  • 相关阅读:
    VirtualXposed查看手机端网页及调试
    vue小toast插件报错runtine-only
    vuex的一个坑
    安卓4.4.4以下手机的兼容性问题
    WebForm(一)——IIS服务器、开发方式和简单基础
    winform窗体(六)——DataGridView控件及通过此控件中实现增删改查
    winform窗体(五)——布局方式
    winform(四)——简单计算器制作
    winform(三)——更换主窗体例子
    winform窗体(二)——控件
  • 原文地址:https://www.cnblogs.com/Mrchengs/p/10093120.html
Copyright © 2011-2022 走看看