• JAVA_OA管理系统(四):基于注解的组件扫描


    总述

    有关:

    本篇文章是和(三)紧挨着的兄弟文章,代码同样是(三)中的那些。


    内容(这篇只是一些新手入门,进阶请看番外)

         1  什么是组件扫描

         2  指定扫描类路径
         3  自动扫描的注解标记
         4  自动扫描注解命名
         5  指定组件的作用域
         6  指定初始化和销毁方法
         7  指定依赖注入关系

         8  注入spring的表达式  


    1  什么是组件扫描

             指定一个包路径,Spring会自动扫描该包及其子包所有组件类,当发现组件类定义
    前有特定的注解标记时,就将该组件纳入到Spring容器中,等价于原来的XML配置bean
    的功能。

    2  指定扫描类路径

            使用组件扫描,首先需要在XML配置中指定扫描父级package路径,容器会自动去扫描
    Com.throne包及其自包下的所有组件,并且实例化bean

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

    而我们的(三)中的java包都在该路径下;

    3  自动扫描的注解标记

            指定扫描的类路径后,并且不是所有的该路径下的组件都会被扫描到Spring容器,
    只有在组件类定义前有一下标记的,才会扫描到Spring容器。

    这里是各种注解的含义

     4  自动扫描注解命名(需要导入webMVC的jar包)


            当一个组件在扫描过程中被检测到时,会生成一个默认的id值,默认id值为小写
      开头的类名,也可以在注解中自定义id。注意:使用注解既然要导入jar包,那么自然要import jar包;
    //比如我们之前的Book类
    
    @Component("book")
    public class Book implements Serializable{
    
    //属性-->也是注解来注入的
           @Value("100")        
            private String bookPrice;
            @Value("hadoop权威指南")
            private String bookName;
    
    //getter and setter
    
    }
    
    //至于获取,则变为注解时添加的ID
    
    Book b1=ac.getBean("book",Book.class);//没有添加id时,为默认的小写首字母的类名(类的规范:首字母大写)
    System.out.println(s.getBook().getBookName());
    System.out.println(s.getBook().getBookId());
    
    结果:
         hadoop权威指南
         100

    这时则不需要再配置xml文件中的bean,因此可见通过更方便的注解来代替原来的xml文件配置,则大大简化编程流程。

    5  指定组件的作用域

             Spring管理的组件,默认的作用域是”singleton”(单例模式),如果需要其他的作用域
            也可以使用@Scope注解,只要在注解中提供作用域的名称即可,此处属性值与(二)中所讲的是一样的。
    //比如我们之前的Book类
    
    @Component("book")
    public class Book implements Serializable{
    
    //属性-->也是注解来注入的
           @Value("100")        
            private String bookPrice;
            @Value("hadoop权威指南")
            private String bookName;
    
    //getter and setter
    
    }
    
    //至于获取,则变为注解时添加的ID
    
    Book b1=ac.getBean("book",Book.class);
    Book b2=ac.getBean("book",Book.class);
    
    
    System.out.println(b1==b2);
    
    结果:
         true
    而
    @Component("book")
    @Scope("prototype")
    public class Book implements Serializable{
    }
    
    System.out.println(b1==b2);
    
    此时运行结果则为:
           false
    

    6  指定初始化和销毁方法 (了解即可)

           @PostConstruct 指定初始化方法
           @PreDestroy 指定销毁方法

    注意:但单例的时候才能关闭,多例时没有关闭

    AbstractApplicationContext才有销毁,他是ApplicationContext的父类,(二)中提过;

            @PostConstruct
            public void init(){
               System.out.println("Book被 初始化了");
            }
            @PreDestroy
            public void destroy(){
               System.out.println("Book被销毁了");
            }
    


    7  指定依赖注入关系

               具有依赖关系的bean对象,利用下面任意一种注解都可以实现关系的注入
              基本类型的值注入可以使用 @value() 标记


    //       @Component(通用注解,当你不知道用什么的时候,可以试试这个)

     具有依赖关系的bean对象,利用下面任意一种注解都可以实现关系的注入
             注意: Setter注入推荐使用@Resource  构造器推荐使用@Autowired


             1  @Autowired/@Qualifier   可以处理构造器注入和Setter注入
                  @Autowired写在构造器前面,申明需要为其注入bean
                  @Qualifier写在参数 前面,申明需要注入的bean的id

    //            这样可以减少代码量,简化编写流程。

    详细的可以看这篇文章(这篇文章的代码比较详细):

                                      Spring@Autowired注解与自动装配


    @Autowired写在属性上面    只会执行构造器的一句 赋值 不会全部执行          
                  如果在单例模式中 @Qualifier可以省略

    2 @Autowired也可以写在set方法上面
                 注入对象单例时,@Qualifier可以省略。此时,Spring按照类型匹配参数。
                 @Autowired也可以写在属性上,作用和写在set方法上类似,但只会执行
                 赋值语句

    3  使用@Resouce注解
               只能用在set方法上和属性上,用在set 方法中 ,执行所有的方法体(

    比如

           在setter中添加一句:System.out.println("我在set中被@Resouce执行了!");

    那么在执行zhegeset时,就会在控制台打印输出这句话。

    ),用在属性上
                只执行方法的赋值

         //假如在一个类(比如是store)中这样写,也就是将@Resource,写在 类名  名字;前
          @Resource
          private Book book;
         // 此时,该类将会获得其中的方法
          String str="applicationContext.xml";
           ApplicationContext ac=new ClassPathXmlApplicationContext(str);
          Store s=ac.getBean("store",Teacher.class);
                  System.out.println(s.getBook().getName());
    
    @Component("book")//这是此时的Book类
    public class Book implements Serializable{
    	@Value("100")
    	private String bookId;
    	@Value("hadoop权威指南")
    	private String bookName;
    	public Book() {
    		System.out.println("我创建了");
    	}
    	public String getBookId() {
    		return bookId;
    	}
    	public void setBookId(String bookId) {
    		this.bookId = bookId;
    	}
    	public String getBookName() {
    		return bookName;
    	}
    	public void setBookName(String bookName) {
    		this.bookName = bookName;
    	}
    	@PostConstruct
    	public void init(){
    		System.out.println("我被初始化了");
    	}
    	@PreDestroy
    	public void destroy(){
    		System.out.println("我被销毁了");
    	}
    	
    
    }
    
    
    /*则会输出:
    我创建了//         创建Book
    我被初始化了//      init()
    hadoop权威指南//      <span style="font-family: Arial, Helvetica, sans-serif;">.getBook().getName()*/</span>

    常用于,减少代码量,进行对象注入。

    注意点:

    1) @Resouce是JAVAEE中的,建议使用降低与spring的耦合,而@Autowired是Spring中的。

    2)@Autowired查找类型是“byType”,@Resouce是"byName",@Qualifier("XXX")与@Autowired配合可以将byType转为byName,其中XXX为name;










  • 相关阅读:
    [Python]计算豆瓣电影TOP250的平均得分
    [Golang]使用自建代理访问指定网站
    HDU 2689.Sort it-冒泡排序
    HDU 1728.逃离迷宫-BFS
    hihoCoder #1498.Diligent Robots
    POJ 2503.Babelfish-sscanf()函数+strcmp()函数+二分
    Codeforces 608 B. Hamming Distance Sum-前缀和
    Codeforces 608 A. Saitama Destroys Hotel
    sscanf()函数
    UVA 11461.Square Numbers
  • 原文地址:https://www.cnblogs.com/fonttian/p/9162866.html
Copyright © 2020-2023  润新知