Spring第五篇_Spring中IOC的常用注解

15 篇文章 0 订阅

1. 常用IOC注解按照作用分类

/**
 * 曾经XML的配置
 *  <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"
 *          scope=""   init-method=""   destroy-method="">
 *       <property name=""  value=""   ref=""></property>
 *  </bean>
 *
 *  注解的分类:
 *  用于创建对象的注解:
 *      他们的作用就和在XML配置文件中编写一个<bean>标签实现的功能是一样的
 *      Component:
 *          作用:用于把当前类对象存入spring容器中
 *          属性:
 *              value:用于指定bean的id, 当我们不写时,他的默认值是当前类名, 并且首字母改小写
 *  用于注入数据的注解:
 *      他们的作用就和在XML配置文件中的bean标签中写一个<property>标签的作用是一样的
 *  用于改变作用范围的注解:
 *      他们的作用就和在bean标签中使用scope属性实现的功能是一样的
 *  和生命周期相关的注解:
 *      他们的作用就和在bean标签中使用 init-method 和 destroy-method的作用是一样的
 *
 *
 */

2. Component注解 - 创建对象

2.1 介绍

Component:
作用:用于把当前类对象存入spring容器中
属性:
value:用于指定bean的id, 当我们不写时,他的默认值是当前类名, 并且首字母改小写

2.2 案例
  1. 创建day02_eesy_01anno_ioc工程

  2. 将 day01_eesy_03spring 工程 src/main 目录下的文件拷贝到 day02_eesy_01anno_ioc工程的src/main目录下

  3. 对业务层 AccountServiceImpl.java 进行添加注解

    //账户的业务层实现类
    
    /**
     * 曾经XML的配置
     *  <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"
     *          scope=""   init-method=""   destroy-method="">
     *       <property name=""  value=""   ref=""></property>
     *  </bean>
     *
     *  注解的分类:
     *  用于创建对象的注解:
     *      他们的作用就和在XML配置文件中编写一个<bean>标签实现的功能是一样的
     *      Component:
     *          作用:用于把当前类对象存入spring容器中
     *          属性:
     *              value:用于指定bean的id, 当我们不写时,他的默认值是当前类名, 并且首字母改小写
     *  用于注入数据的注解:
     *      他们的作用就和在XML配置文件中的bean标签中写一个<property>标签的作用是一样的
     *  用于改变作用范围的注解:
     *      他们的作用就和在bean标签中使用scope属性实现的功能是一样的
     *  和生命周期相关的注解:
     *      他们的作用就和在bean标签中使用 init-method 和 destroy-method的作用是一样的
     *
     *
     */
    @Component(value = "accountService")    //指定id为 accountService, 不指定时id为accountServiceImpl
    public class AccountServiceImpl implements IAccountService {
    
        private IAccountDao accountDao = new AccountDaoImpl();
    
        public AccountServiceImpl(){
            System.out.println("对象AccountDaoImpl创建了");
        }
    
        public void saveAccount() {
            accountDao.saveAccount();
        }
    }
    
    
  4. 在bean.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: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/context
            http://www.springframework.org/schema/context/spring-context.xsd">
    
        <!--告知Spring在创建容器时要扫描的包, 配置所需要的标签不是在beans的约束中,
            而是一个名称为context的名称空间和约束中-->
    
        <context:component-scan base-package="com.itheima"></context:component-scan>
    </beans>
    

    说明: 进行注解相关配置时和直接在xml文件进行配置的约束条件不同

    1. 在模拟表现层Client.java 运行
    //模拟一个表现层,用于调用业务层
    public class Client {
    
    
        public static void main(String[] args) {
            //1.获取核心容器对象
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
    
            //2.根据id获取bean对象
            IAccountService accountService = (IAccountService) applicationContext.getBean("accountService");
    
    
            System.out.println(accountService);
    
        }
    }
    
    1. 目录结构

3. 由Component衍生的注解

3.1 介绍

Component:
作用:用于把当前类对象存入spring容器中
属性:
value:用于指定bean的id, 当我们不写时,他的默认值是当前类名, 并且首字母改小写

​ Controller: 一般用在表现层
​ Service: 一般用在业务层
​ Repository 一般用在持久层
​ 以上三个注解他们的作用和属性与Component是一模一样的,
​ 他们三个是Spring框架为我们提供明确的三层使用 的注释, 使我们的三层对象更清晰

3.2 案例
  1. 修改业务层AccountServiceImpl.java 的注解

    /**
     * 曾经XML的配置
     *  <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"
     *          scope=""   init-method=""   destroy-method="">
     *       <property name=""  value=""   ref=""></property>
     *  </bean>
     *
     *  用于注入数据的注解:
     *      他们的作用就和在XML配置文件中的bean标签中写一个<property>标签的作用是一样的
     *  用于改变作用范围的注解:
     *      他们的作用就和在bean标签中使用scope属性实现的功能是一样的
     *  和生命周期相关的注解:
     *      他们的作用就和在bean标签中使用 init-method 和 destroy-method的作用是一样的
     *
     *
     */
    @Service(value = "accountService")    //指定id为 accountService, 不指定时id为accountServiceImpl, value可省略
    public class AccountServiceImpl implements IAccountService {
    
        private IAccountDao accountDao = new AccountDaoImpl();
    
        public AccountServiceImpl(){
            System.out.println("对象AccountDaoImpl创建了");
        }
    
        public void saveAccount() {
            accountDao.saveAccount();
        }
    }
    
    
  2. 为持久层 AccountDaoImpl添加注解

    //账户的持久层实现类
    @Repository("accountDao")
    public class AccountDaoImpl implements IAccountDao {
        public void saveAccount() {
            System.out.println("保存了账户");
        }
    }
    
  3. 在模拟表现层Client.java中运行

    //模拟一个表现层,用于调用业务层
    public class Client {
    
    
        public static void main(String[] args) {
            //1.获取核心容器对象
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
    
            //2.根据id获取bean对象
            IAccountService accountService = (IAccountService) applicationContext.getBean("accountService");
            System.out.println(accountService);
    
            IAccountDao accountDao=applicationContext.getBean("accountDao",IAccountDao.class);
            System.out.println(accountDao);
    
    
        }
    
    }
    
  4. 运行结果

  5. 目录结构

4. 自动按照类型注入-注入数据

4.1 Autowired
1. 介绍

用于注入数据的注解:
他们的作用就和在XML配置文件中的bean标签中写一个标签的作用是一样的
Autowired:
作用:
自动按照类型注入, 只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以成功注入
如果IOC容器中没有任何bean的类型和要注入的变量类型匹配,则报错
如果IOC容器中有多个类型匹配时,先根据数据类型确定查找的 IOC 容器的范围, 再将变量名作为id进行查找, 如果找不到与之对应的id, 则报错
出现位置:
可以是变量上,也可以是方法上
细节:
在使用注解时, set方法就不是必需的了

2. 案例
  1. 对业务层实现类 AccountServiceImpl.java 进行修改, 为成员变量 accountDao添加注解

    //账户的业务层实现类
    
    /**
     * 曾经XML的配置
     *  <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"
     *          scope=""   init-method=""   destroy-method="">
     *       <property name=""  value=""   ref=""></property>
     *  </bean>
     *
     *  用于注入数据的注解:
     *      他们的作用就和在XML配置文件中的bean标签中写一个<property>标签的作用是一样的
     *      Autowired:
     *          作用:
     *              自动按照类型注入, 只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以成功注入
     *              如果IOC容器中没有任何bean的类型和要注入的变量类型匹配,则报错
     *              如果IOC容器中有多个类型匹配时,先根据数据类型确定查找的 IOC 容器的范围, 再将变量名作为id进行查找, 如果找不到与之对应的id, 则报错
     *          出现位置:
     *              可以是变量上,也可以是方法上
     *          细节:
     *              在使用注解时, set方法就不是必需的了
     *
     *  用于改变作用范围的注解:
     *      他们的作用就和在bean标签中使用scope属性实现的功能是一样的
     *  和生命周期相关的注解:
     *      他们的作用就和在bean标签中使用 init-method 和 destroy-method的作用是一样的
     *
     *
     */
    @Service(value = "accountService")    //指定id为 accountService, 不指定时id为accountServiceImpl, value可省略
    public class AccountServiceImpl implements IAccountService {
    
        @Autowired
        private IAccountDao accountDao = null;
    
        public AccountServiceImpl(){
            System.out.println("对象AccountDaoImpl创建了");
        }
    
        public void saveAccount() {
            accountDao.saveAccount();
        }
    }
    
  2. 在模拟表现层Client.java运行

    //模拟一个表现层,用于调用业务层
    public class Client {
    
    
        public static void main(String[] args) {
            //1.获取核心容器对象
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
    
            //2.根据id获取bean对象
            IAccountService accountService = (IAccountService) applicationContext.getBean("accountService");
            System.out.println(accountService);
            accountService.saveAccount();
    
    
        }
    
    }
    
    说明: 此时自动按照类型注入

4.2 Qualifier
1. 介绍

用于注入数据的注解:
他们的作用就和在XML配置文件中的bean标签中写一个标签的作用是一样的
Autowired:
作用:
自动按照类型注入, 只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以成功注入
如果IOC容器中没有任何bean的类型和要注入的变量类型匹配,则报错
如果IOC容器中有多个类型匹配时,先根据数据类型确定查找的 IOC 容器的范围, 再将变量名作为id进行查找, 如果找不到与之对应的id, 则报错
出现位置:
可以是变量上,也可以是方法上
细节:
在使用注解时, set方法就不是必需的了
Qualifier:
作用:

​ 在按照数据类型注入的基础之上 再按照变量名称注入。 他在给类成员注入时,不能单独使用; 在给方法参数注 入时,可以单独使用(稍后讲)
属性:
value: 用于指定注入bean的id

说明: Qualifer注解用于解决 IOC容器中有多个bean与要注入的数据类型匹配的问题

2. 案例
  1. 修改 持久层实现类 AccountDaoImpl.java

    //账户的持久层实现类
    @Repository("accountDao1")
    public class AccountDaoImpl implements IAccountDao {
        public void saveAccount() {
            System.out.println("保存了账户111111111");
        }
    }
    
  2. 创建 持久层实现类 AccountDaoImpl2.java

    //账户的持久层实现类
    @Repository("accountDao2")
    public class AccountDaoImpl2 implements IAccountDao {
        public void saveAccount() {
            System.out.println("保存了账户2222222222");
        }
    }
    
  3. 对业务层实现类 AccountServiceImpl.java进行修改

    //账户的业务层实现类
    
    /**
     * 曾经XML的配置
     *  <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"
     *          scope=""   init-method=""   destroy-method="">
     *       <property name=""  value=""   ref=""></property>
     *  </bean>
     *
     *  注解的分类:
     *  用于创建对象的注解:
     *      他们的作用就和在XML配置文件中编写一个<bean>标签实现的功能是一样的
     *      Component:
     *          作用:用于把当前类对象存入spring容器中
     *          属性:
     *              value:用于指定bean的id, 当我们不写时,他的默认值是当前类名, 并且首字母改小写
     *          Controller: 一般用在表现层
     *          Service:    一般用在业务层
     *          Repository  一般用在持久层
     *          以上三个注解他们的作用和属性与Component是一模一样的,
     *          他们三个是Spring框架为我们提供明确的三层使用 的注释, 使我们的三层对象更清晰
     *
     *  用于注入数据的注解:
     *      他们的作用就和在XML配置文件中的bean标签中写一个<property>标签的作用是一样的
     *      Autowired:
     *          作用:
     *              自动按照类型注入, 只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以成功注入
     *              如果IOC容器中没有任何bean的类型和要注入的变量类型匹配,则报错
     *              如果IOC容器中有多个类型匹配时,先根据数据类型确定查找的 IOC 容器的范围, 再将变量名作为id进行查找, 如果找不到与之对应的id, 则报错
     *          出现位置:
     *              可以是变量上,也可以是方法上
     *          细节:
     *              在使用注解时, set方法就不是必需的了
     *      Qualifier:
     *          作用: 在按照数据类型注入的基础之上 再按照变量名称注入。 他在给类成员注入时,不能单独使用; 在给方法参数注入时,可以单独使用(稍后讲)
     *          属性:
     *              value: 用于指定注入bean的id
     *
     *  用于改变作用范围的注解:
     *      他们的作用就和在bean标签中使用scope属性实现的功能是一样的
     *  和生命周期相关的注解:
     *      他们的作用就和在bean标签中使用 init-method 和 destroy-method的作用是一样的
     *
     *
     */
    @Service(value = "accountService")    //指定id为 accountService, 不指定时id为accountServiceImpl, value可省略
    public class AccountServiceImpl implements IAccountService {
    
        @Autowired
        @Qualifier(value = "accountDao1")
        private IAccountDao accountDao = null;
    
        public AccountServiceImpl(){
            System.out.println("对象AccountDaoImpl创建了");
        }
    
        public void saveAccount() {
            accountDao.saveAccount();
        }
    }
    
  4. 在模拟表现层Client.java 运行

    //模拟一个表现层,用于调用业务层
    public class Client {
    
    
        public static void main(String[] args) {
            //1.获取核心容器对象
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
    
            //2.根据id获取bean对象
            IAccountService accountService = (IAccountService) applicationContext.getBean("accountService");
            System.out.println(accountService);
    
    //        IAccountDao accountDao=applicationContext.getBean("accountDao",IAccountDao.class);
    //        System.out.println(accountDao);
    
            accountService.saveAccount();
    
        }
    
    }
    
  5. 运行结果

4.3 Resource
1. 介绍

用于注入数据的注解:
他们的作用就和在XML配置文件中的bean标签中写一个标签的作用是一样的
Autowired:
作用:
自动按照类型注入, 只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以成功注入
如果IOC容器中没有任何bean的类型和要注入的变量类型匹配,则报错
如果IOC容器中有多个类型匹配时,先根据数据类型确定查找的 IOC 容器的范围, 再将变量名作为id进行查找, 如果找不到与之对应的id, 则报错
出现位置:
可以是变量上,也可以是方法上
细节:
在使用注解时, set方法就不是必需的了
Qualifier:
作用:

​ 在按照数据类型注入的基础之上 再按照变量名称注入。 他在给类成员注入时,不能单独使用; 在给方法参数注 入时,可以单独使用(稍后讲)
属性:
value: 用于指定注入bean的id

Resource:
作用: 直接按照bean的id注入
属性:
​ name: 用于指定bean的id

2. 案例
  1. 对业务实现类AccountServiceImpl.java 进行修改

    //账户的业务层实现类
    
    /**
     * 曾经XML的配置
     *  <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"
     *          scope=""   init-method=""   destroy-method="">
     *       <property name=""  value=""   ref=""></property>
     *  </bean>
     *
     *
     *  用于注入数据的注解:
     *      他们的作用就和在XML配置文件中的bean标签中写一个<property>标签的作用是一样的
     *      Autowired:
     *          作用:
     *              自动按照类型注入, 只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以成功注入
     *              如果IOC容器中没有任何bean的类型和要注入的变量类型匹配,则报错
     *              如果IOC容器中有多个类型匹配时,先根据数据类型确定查找的 IOC 容器的范围, 再将变量名作为id进行查找, 如果找不到与之对应的id, 则报错
     *          出现位置:
     *              可以是变量上,也可以是方法上
     *          细节:
     *              在使用注解时, set方法就不是必需的了
     *      Qualifier:
     *          作用: 在按照数据类型注入的基础之上 再按照变量名称注入。 他在给类成员注入时,不能单独使用; 在给方法参数注入时,可以单独使用(稍后讲)
     *          属性:
     *              value: 用于指定注入bean的id
     *      Resource:
     *          作用: 直接按照bean的id注入
     *          属性:
     *              name: 用于指定bean的id
     *      以上三个注解都只能注入其他bean类型的数据, 而基本类型和String类型无法使用上述注解实现
     *      另外: 集合类型的注入只能通过XML实现
     *
     *  用于改变作用范围的注解:
     *      他们的作用就和在bean标签中使用scope属性实现的功能是一样的
     *  和生命周期相关的注解:
     *      他们的作用就和在bean标签中使用 init-method 和 destroy-method的作用是一样的
     *
     *
     */
    @Service(value = "accountService")    //指定id为 accountService, 不指定时id为accountServiceImpl, value可省略
    public class AccountServiceImpl implements IAccountService {
    
    //    @Autowired
    //    @Qualifier(value = "accountDao1")
        @Resource(name = "accountDao2")
        private IAccountDao accountDao = null;
    
        public AccountServiceImpl(){
            System.out.println("对象AccountDaoImpl创建了");
        }
    
        public void saveAccount() {
            accountDao.saveAccount();
        }
    }
    
  2. 其他不变, 和上例一样

  3. 运行结果

  4. 目录结构

总结:

  • 以上三个注解都只能注入其他bean类型的数据, 而基本类型和String类型无法使用上述注解实现

  •  另外: 集合类型的注入只能通过XML实现
    
4.4 Value

Value:
作用: 用于注入基本类型和Spring类型的数据
属性:
value: 用于指定数据的值, 它可以使用Spring中的 SpEL(也就是Spring的EL表达式)

​ SpEL的写法: ${表达式}

5. 改变作用范围的注解

Scope

1. 介绍

Scope
作用: 用于指定bean的作用范围
属性:
value: 指定范围的取值

​ 常用取值: singleton prototype

2. 案例
  1. 在业务实现类AccountServiceImpl.java进行修改

    //账户的业务层实现类
    
    /**
     * 曾经XML的配置
     *  <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"
     *          scope=""   init-method=""   destroy-method="">
     *       <property name=""  value=""   ref=""></property>
     *  </bean>
     *
     *  用于改变作用范围的注解:
     *      他们的作用就和在bean标签中使用scope属性实现的功能是一样的
     *      Scope
     *          作用: 用于指定bean的作用范围
     *          属性:
     *              value: 指定范围的取值, 常用取值: singleton prototype
     *  和生命周期相关的注解:
     *      他们的作用就和在bean标签中使用 init-method 和 destroy-method的作用是一样的
     *
     *
     */
    @Service(value = "accountService")    //指定id为 accountService, 不指定时id为accountServiceImpl, value可省略
    @Scope(value = "prototype")
    public class AccountServiceImpl implements IAccountService {
    
    //    @Autowired
    //    @Qualifier(value = "accountDao1")
        @Resource(name = "accountDao2")
        private IAccountDao accountDao = null;
    
        public AccountServiceImpl(){
            System.out.println("对象AccountDaoImpl创建了");
        }
    
        public void saveAccount() {
            accountDao.saveAccount();
        }
    
    
    }
    
    
  2. 其他和上例相同

  3. 在模拟表现层 Client.java 中运行

    //模拟一个表现层,用于调用业务层
    public class Client {
    
    
        public static void main(String[] args) {
            //1.获取核心容器对象
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
    
            //2.根据id获取bean对象
            IAccountService accountService = (IAccountService) applicationContext.getBean("accountService");
            IAccountService accountService2 = (IAccountService) applicationContext.getBean("accountService");
            System.out.println(accountService == accountService2);
    
        }
    
    }
    
  4. 运行结果

6. 和生命周期相关的注解

1. 介绍

和生命周期相关的注解:
他们的作用就和在bean标签中使用 init-method 和 destroy-method的作用是一样的

PreDestroy:
​ 作用: 用于指定销毁方法
PostConstruct:
​ 作用: 用于指定初始化方法

2. 案例
  1. 对业务实现类AccountServiceImpl.java进行修改

    //账户的业务层实现类
    
    /**
     * 曾经XML的配置
     *  <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"
     *          scope=""   init-method=""   destroy-method="">
     *       <property name=""  value=""   ref=""></property>
     *  </bean>
     *
     *  和生命周期相关的注解:
     *      他们的作用就和在bean标签中使用 init-method 和 destroy-method的作用是一样的
     *      PreDestroy
     *          作用: 用于指定销毁方法
     *      PostConstruct:
     *          作用: 用于指定初始化方法
     *
     *
     */
    @Service(value = "accountService")    //指定id为 accountService, 不指定时id为accountServiceImpl, value可省略
    //@Scope(value = "prototype")  // 多例
    public class AccountServiceImpl implements IAccountService {
    
    //    @Autowired
    //    @Qualifier(value = "accountDao1")
        @Resource(name = "accountDao2")
        private IAccountDao accountDao = null;
    
        public AccountServiceImpl(){
            System.out.println("对象AccountDaoImpl创建了");
        }
    
        public void saveAccount() {
            accountDao.saveAccount();
        }
    
        @PostConstruct
        public void init(){
            System.out.println("对象初始化了");
        }
    
        @PreDestroy
        public void destroy(){
            System.out.println("对象销毁了");
        }
    
    }
    
  2. 在模拟表现层 Client.java 运行

    //模拟一个表现层,用于调用业务层
    public class Client {
    
    
        public static void main(String[] args) {
            //1.获取核心容器对象
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
    
            //2.根据id获取bean对象
            IAccountService accountService = (IAccountService) applicationContext.getBean("accountService");
             accountService.saveAccount();
    
            ((ClassPathXmlApplicationContext) applicationContext).close();
        }
    }
    
  3. 运行结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值