zoukankan      html  css  js  c++  java
  • Java -- Spring学习笔记4、基于注解的DI

    1、基于注解的DI

    对于DI使用注解,将不再需要在Spring配置文件中声明bean实例。Spring中使用注解,需要在Spring配置文件中配置组件扫描器,用于在指定的基本包中扫描注解。

    1.1、指定多个包的三种方式

    • 使用多个context:component-scan指定不同的包路径:
    <context:component-scan base-package="com.rg.entity"/>
    <context:component-scan base-package="com.rg.service"/>
    
    • 指定base-package的值使用分隔符

    分隔符可以使用逗号分号还可以使用空格,不建议使用空格。

    <context:component-scan base-package="com.rg.entity,com.rg.service"/>
    
    • base-package 是指定到父包名

    base-package的值表是基本包,容器启动会扫描包及其子包中的注解,当然也会扫描到子包下级的子包。所以 base-package 可以指定一个父包就可以。

    <context:component-scan base-package="com.rg"/>
    
    • 或者最顶级的父包
    <context:component-scan base-package="com"/>
    

    但不建议使用顶级的父包,扫描的路径比较多,导致容器启动时间变慢。指定到目标包和合适的。也就是注解所在包全路径。例如注解的类在com.rg.entity包中:

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

    2、定义Bean的注解@Component

    需要在类上使用注解@Component,该注解的value属性用于指定该bean的id值。

    @Component 不指定 value 属性,bean 的 id 是类名的首字母小写。

    • 首先在配置文件配置组件扫描器
    <context:component-scan base-package="com.rg.entity"/>
    
    • 实体类如下:
    @Component("myClient")
    public class Client
    {
        private int id;
        private String name;
        //setter toString()....
    }
    
    • 测试方法:
    @Test
        public void test04()
        {
            String config = "applicationContext.xml";
            ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
            Client client = (Client) ctx.getBean("myClient");
            client.setId(1);
            client.setName("大力");
            System.out.println(client);
        }
    

    2.1、简单类型属性注入@Value

    需要在属性上使用注解@Value,该注解的value属性用于指定要注入的值。使用该注解完成属性注入时,类中无需setter。

    • 实体类中使用Value注解:
    @Component("myClient")
    public class Client
    {
        @Value("1001")
        private int id;
        @Value("贝贝")
        private String name;
        //setter toString....
    }
    
    • 测试方法:
    @Test
        public void test04()
        {
            String config = "applicationContext.xml";
            ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
            Client client = (Client) ctx.getBean("myClient");
            System.out.println(client);
        }
    

    2.2、byType自动注入@Autowired

    需要在引用属性上使用注解@Autowired,该注解默认使用按类型自动装配Bean的方式。使用该注解完成属性注入时,

    • 实体类如下:
    @Component("myClient")
    public class Client
    {
        @Value("1001")
        private int id;
        @Value("贝贝")
        private String name;
        @Autowired
        private School school;
        //setter toString....
    }
    @Component
    public class School
    {
        @Value("宾夕法尼亚大学")
        private String name;
        //toString.......
    }
    
    • 测试方法同上。

    2.3、byName自动注入@Autowired与@Qualifier

    需要在引用属性上联合使用注解@Autowired与@Qualifier。@Qualifier的value属性用于指定要匹配的Bean的id值。

    • 实体类如下:
    //Client类如下:
    @Component("myClient")
    public class Client
    {
        @Value("1001")
        private int id;
        @Value("贝贝")
        private String name;
        @Autowired
        @Qualifier(value = "mySchool")
        private School school;
    }
    //School类如下:
    @Component("mySchool")
    public class School
    {
        @Value("宾夕法尼亚大学")
        private String name;
    }
    
    • 测试方法同上。
    • @Autowired还有一个属性required,默认值为true,意思是当匹配失败后,程序运行会终止、抛出异常、表示没找到。若将其值设置为false,匹配失败将被忽略,未匹配的属性值为null。

    3、JDK注解@Resource自动注入

    Spring提供了对jdk中@Resource注解的支持。@Resource注解既可以按名称匹配,也可以按类型匹配。默认是按名称注入。使用该注解,要求JDK必须是6及以上版本。@Resource可在属性和set方法上。

    3.1、byType注入引用类型属性

    @Resource注解若不带任何参数,采用默认按名称的方式注入,按名称不能注入Bean,则会按照类型进行Bean的匹配注入。

    • 实体类如下:
    @Component("myClient")
    public class Client
    {
        @Value("1001")
        private int id;
        @Value("贝贝")
        private String name;
        //名称:school
        //类型:School
        @Resource
        private School school;
        //setter toString....
    }
    //名称:mySchool
    //类型:School
    @Component("mySchool")
    public class School
    {
        @Value("宾夕法尼亚大学")
        private String name;
        //setter toString()....
    }
    

    3.2、byName注入引用类型属性

    @Resource注解指定其name属性,则name的值即为按照名称进行匹配的Bean的id。

    • 实体类如下:
    @Component("myClient")
    public class Client
    {
        @Value("1001")
        private int id;
        @Value("贝贝")
        private String name;
        //指明名称为:mySchool
        @Resource(name = "mySchool")
        private School school;
        //setter toString....
    }
    //名称:mySchool
    @Component("mySchool")
    public class School
    {
        @Value("宾夕法尼亚大学")
        private String name;
        //setter toString()....
    }
    
    • 测试方法同上。

    概括来讲、注解更方便、直观、代码少,没有配置文件的书写那么复杂、但是、以硬编码的方式写入到 Java 代码中,修改是需要重新编译代码的。XML方式配置和代码是分离的、在 xml 中做修改,无需编译代码,只需重启服务器即可将新的配置加载、缺点是:编写麻烦,效率低,大型项目过于复杂

  • 相关阅读:
    毕业半年,码过5个城市
    Java实现office文档与pdf文档的在线预览功能
    挺过最艰难的2018,我终将长大
    dubbo源码分析(一)-从xml到我们认识的Java对象
    沉淀一年,我想推荐这些书给你
    Java动态代理(一)
    Java工程师成神之路思维导图
    Java
    阿里巴巴Java开发手册思维导图
    Mysql的排他锁和共享锁
  • 原文地址:https://www.cnblogs.com/dcy521/p/14770377.html
Copyright © 2011-2022 走看看