十IOC操作Bean管理(基于注解方式)

Posted 上善若水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十IOC操作Bean管理(基于注解方式)相关的知识,希望对你有一定的参考价值。

  1. 什么是注解

    • 注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值…)
    • 使用注解,注解作用在类上面,方法上面,属性上面
    • 使用注解目的:简化xml配置
  2. spring针对bean管理中创建对象提供的注解

    • @Component Spring容器提供了一种普通组件,用它可以创建对象。

    • @Service 一般用于业务逻辑层,也就是service层。

    • @Controller 一般用于控制层,也就是web层。

    • Repository 一般用于持久层,也就是dao层。

      上面四个注解功能是一样的,都可以用来创建bean实例

  3. 基于注解方式实现对象创建

    • 第一步:引入依赖
      在这里插入图片描述

    • 第二步:开启组件扫描

      <?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">
          <context:component-scan base-package="com.deewin"></context:component-scan>
      </beans>
      
    • 第三步:创建类,在类上面添加创建对象注解

      package com.deewin.service;
      
      import org.springframework.stereotype.Component;
      // 在注解里面value属性值可以省略不写,默认值是类名称,首字母小写
      // UserService --- userService
      @Component(value = "userService") // <bean id="userService" class="com.deewin.service.UserService"/>
      public class UserService
      {
          public void add()
          {
              System.out.println("service add...");
          }
      }
      
    • 第四步:编写测试类

      package com.deewin.test;
      
      import com.deewin.service.UserService;
      import org.junit.Test;
      import org.springframework.context.ApplicationContext;
      import org.springframework.context.support.ClassPathXmlApplicationContext;
      
      public class MyTest1 {
          @Test
          public void test1()
          {
              ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
              UserService userService = context.getBean("userService", UserService.class);
              System.out.println(userService);
              userService.add();
          }
      }
      

      项目结构:
      在这里插入图片描述
      运行结果:
      在这里插入图片描述

  4. 开启组件扫描细节配置

    <?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">
        <!--
            示例1
            use-default-filters="false" 表示现在不使用默认filter,使用自己配置filter
            context:include-filter ,设置扫描那些内容。
        -->
        <context:component-scan base-package="com.deewin" use-default-filters="false">
            <!--只扫描@Controller注解配置的类-->
            <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
        <!--
            示例2
            下面配置扫描包所有内容
            context:exclude-filter:设置那些内容不进行扫描
        -->
        <context:component-scan base-package="com.deewin">
            <!--不扫描@Controller注解配置的类-->
            <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        </context:component-scan>
    
    </beans>
    
  5. 基于注解方式实现属性注入

    • @Autowired:根据属性类型进行自动装配

      • 第一步:把service和dao对象创建,在service和dao类添加创建对象注解
      package com.deewin.service;
      
      public interface UserService
      {
          public void add();
      }
      
      package com.deewin.dao;
      
      import org.springframework.stereotype.Repository;
      
      @Repository
      public class UserDao {
          public void save()
          {
              System.out.println("dao add...");
          }
      }
      
      • 第二步:在service注入dao对象,在service类添加dao类型属性,在属性上面使用注解
      package com.deewin.service;
      
      import com.deewin.dao.UserDao;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.stereotype.Service;
      
      @Service
      public class UserServiceImpl implements UserService {
          // 定义dao类型属性,不需要添加set方法
          // 添加注入属性注解
          @Autowired
          public UserDao userDao;
          @Override
          public void add() {
              System.out.println("service add...");
              userDao.save();
          }
      }
      
      • 第三步:测试
      package com.deewin.test;
      
      import com.deewin.service.UserService;
      import org.junit.Test;
      import org.springframework.context.ApplicationContext;
      import org.springframework.context.support.ClassPathXmlApplicationContext;
      
      public class MyTest1 {
          @Test
          public void test1()
          {
              ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
              UserService userService = context.getBean("userServiceImpl", UserService.class);
              userService.add();
          }
      }
      

      运行结果:
      在这里插入图片描述

    • @Qualifier:根据名称进行注入

      这个@Qualifier注解的使用,和上面@Autowired一起使用

      package com.deewin.dao;
      
      public interface UserDao {
          public void save();
      }
      
      package com.deewin.dao;
      
      import org.springframework.stereotype.Repository;
      
      @Repository
      public class UserDaoImpl implements UserDao{
          @Override
          public void save() {
              System.out.println("dao add...");
          }
      }
      
      package com.deewin.service;
      
      public interface UserService
      {
          public void add();
      }
      
      package com.deewin.service;
      
      import com.deewin.dao.UserDaoImpl;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.beans.factory.annotation.Qualifier;
      import org.springframework.stereotype.Service;
      
      @Service
      public class UserServiceImpl implements UserService {
          // 定义dao类型属性,不需要添加set方法
          // 添加注入属性注解
          @Autowired
          // 当UserDao接口有多个实现类时,需要使用@Qualifier注解按名称进行注入
          @Qualifier(value = "userDaoImpl")
          public UserDaoImpl userDao;
          @Override
          public void add() {
              System.out.println("service add...");
              userDao.save();
          }
      }
      
    • @Resource:可以根据类型注入,可以根据名称注入

      package com.deewin.dao;
      
      import org.springframework.stereotype.Repository;
      
      @Repository(value = "userDaoImpl1")
      public class UserDaoImpl implements UserDao{
          @Override
          public void save() {
              System.out.println("dao add...");
          }
      }
      
      package com.deewin.service;
      
      import com.deewin.dao.UserDaoImpl;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.beans.factory.annotation.Qualifier;
      import org.springframework.stereotype.Service;
      
      import javax.annotation.Resource;
      
      @Service
      public class UserServiceImpl implements UserService {
          // @Resource // 根据类型进行注入
          @Resource(name = "userDaoImpl1") //根据名称进行注入
          public UserDaoImpl userDao;
          @Override
          public void add() {
              System.out.println("service add...");
              userDao.save();
          }
      }
      
    • @Value:注入普通类型属性

      package com.deewin.service;
      
      import com.deewin.dao.UserDaoImpl;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.beans.factory.annotation.Qualifier;
      import org.springframework.beans.factory.annotation.Value;
      import org.springframework.stereotype.Service;
      
      import javax.annotation.Resource;
      
      @Service
      public class UserServiceImpl implements UserService {
          @Value(value = "abc")
          private String name;
      
          // @Resource // 根据类型进行注入
          @Resource(name = "userDaoImpl1") //根据名称进行注入
          public UserDaoImpl userDao;
          @Override
          public void add() {
              System.out.println("service add..."+name);
              userDao.save();
          }
      }
      

      运行结果:
      在这里插入图片描述

  6. 完全注解开发

    package com.deewin.config;
    
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration // 作为配置类,替代xml配置文件
    @ComponentScan(basePackages = {"com.deewin"})
    public class SpringConfig {
    }
    
    package com.deewin.test;
    
    import com.deewin.config.SpringConfig;
    import com.deewin.service.UserService;
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    public class MyTest1 {
        @Test
        public void test1()
        {
            ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
            UserService userService = context.getBean("userServiceImpl", UserService.class);
            userService.add();
        }
    }
    

    项目结构:
    在这里插入图片描述
    运行结果:
    在这里插入图片描述

以上是关于十IOC操作Bean管理(基于注解方式)的主要内容,如果未能解决你的问题,请参考以下文章

第249天学习打卡(知识点回顾IOC操作Bean管理 基于注解方式)

spring5:IOC 操作 Bean 管理(基于注解方式)

Spring5学习笔记 — “IOC操作Bean管理(基于注解)”

Spring5学习笔记 — “IOC操作Bean管理(基于注解)”

三IOC操作Bean管理

Spring-IOC容器-Bean管理-基于注解方式详解