spring基础02-IOC容器3-基于注解操作bean管理

2.4 IOC操作Bean管理(基于注解)(正片刚刚开始)

使用注解的原因:减少甚至取消xml代码配置

2.4.1spring针对bean管理中创建对象提供注解

  • 提供了四个注解,功能是一样的,不强制,但是约定了不同的使用位置
    • @Component
      • 一般的创建对象
    • @Service
      • 一般用在业务逻辑层或者Service层
    • @Controller
      • 一般用在web层
    • Repository
      • 一般用在持久层or Dao层

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

  • 1.引入依赖

    • spring-aop jar包
  • 2.开启组件扫描

  • 声明context命名空间,略
    <context:component-scan base-package="demo01"></context:component-scan>
    
  • 3.创建类,在类上添加注解

  • //注解的value可以和xml中bean标签的id对应起来,class就是当前
        //value可以不写,默认是类名称,首字母小写,即userService
    @Component(value = "userService")
    public class UserService {
        public void add(){
            System.out.println("service add...");
        }
    }
    
  • 4.测试类和xml方法一模一样,getBean里面用注解的value

a.开启组件扫描的一些细节问题

  • 每个context:component-scan都有一个filter,用来确定扫描的范围,可以默认,可以自定义,
<!--示例1
    use-default-filters="false表示不使用默认的filtere,自己配置filter
    -->
<context:component-scan base-package="com.zhang.demo01" use-default-filters="false">
    <!--根据注解来判断扫描范围,只扫描带Controller注解的类-->
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>


<!--示例2
    下面配置扫描包的虽有内容,除了Controller注解的类
-->
<context:component-scan base-package="com.zhang.demo01">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

2.4.3 基于注解方式实现属性注入

  • 三个最常用的注解

    • @AutoWired 根据属性类型自动装配

    • @Qualifier 根据属性名称进行注入

    • @Resource 可以根据类型注入,也可以根据名称注入

    • @Value 注入普通类型,比如String

1. @Autowired

  • 目标 创建service和dao对象,在service里调用dao

  • 第一步,把service,dao上都添加创建对象的注解

  • userDao类

  • @Repository
    public class UserDaoImpl  implements UserDao{
        @Override
        public void add() {
            System.out.println("dao add...");
        }
    }
    
  • 第二步,在service里注入dao对象,在service类里声明dao的对象,在dao属性上添加注解

  • service类

  • @Service(value = "userService")
    public class UserService {
        @Autowired
        private UserDao userDao;
        //注解创建对象,不需要set方法
        public void add(){
            userDao.add();
            System.out.println("service add...");
        }
    }
    

2. @Qualifier

  • 这个注解的使用需要和上面的Autowired一起使用

  • 例如,上面的UserDao接口可能不止一个实现类,而为了去耦合,在Service中使用的多态声明private UserDao userDao;

  • 这就造成Autowired注解不能自动识别,是哪一个实现类的对象

  • 所以使用Qualifier来指明具体用的哪一个类

  • Service类,

  • @Service(value = "userService")
    public class UserService {
        @Autowired
        @Qualifier(value = "XXXXXX")
        private UserDao userDao;//
        //注解创建对象,不需要set方法
        public void add(){
            userDao.add();
            System.out.println("service add...");
        }
    }
    
  • userDao类

  • public interface UserDao {//实现类可不一定只有一个
        public void add();
    }
    
    @Repository(value = "XXXXXX")
    public class UserDaoImpl  implements UserDao{
        @Override
        public void add() {
            System.out.println("dao add...");
        }
    }
    

3.@Resource (不是spring里的,需要导javax包)_

  • 可以根据类型注入,也可以根据名称注入,简单说二合一了,不冲突就可一个直接用@Resource,冲突了就可以添加name值指定具体的类

  • 注意!!!Resource使用的属性是name,不是value

    • @Resource(name="xxxxXxx")
  • dao类

  • public interface UserDao {
        public void add();
    }
    //比较实现类1,注意!默认命名
    @Repository
    public class UserDaoImplCompare implements UserDao {
        @Override
        public void add() {
            System.out.println("userdao add compare");
        }
    }
    
    //实现类2
    @Repository//(value = "XXXXXX")
    public class UserDaoImpl  implements UserDao{
        @Override
        public void add() {
            System.out.println("dao add...");
        }
    }
    
  • Service类

  • @Service(value = "userService")
    public class UserService {
    //    @Autowired
    //    @Qualifier(value = "XXXXXX")
        @Resource(name="userDaoImplCompare")
        private UserDao userDao;//
        //注解创建对象,不需要set方法
        public void add(){
            userDao.add();
            System.out.println("service add...");
        }
    }
    

4.@Value

给普通属性注入值

简单,略过

@Value(value = "abc")
private String name;

2.4.4 纯注解开发,不要xml

先回忆一下,xml都干啥了,就干了一行是,配置了扫描,也就是告诉bean扫描注解的范围

<context:component-scan base-package="com.zhang.demo01"></context:component-scan>
  • 1.创建配置类,替代xml配置文件

    • 学了这么久了,主要都干了啥事呢?就是如何才能告诉Spring,我的这个普通的java类需要你来帮忙用IOC创建对象
    • 怎么告诉,之前用xml,现在用注解,那么这个配置类,也可以通过注解来操作:@Configuration
  • 2.创建测试类(bean操作的地方和前面一样,但是测试类里面不能用ClassPathXml了)

    • 使用AnnotationConfigApplicationContext(SpringConfig.class);代替

    • @Test
      public  void test2(){
          ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
          UserService userService = context.getBean("userService", UserService.class);
          userService.add();
      }
      
  • 真正的完全注解开发得用Spring boot

    • spring boot 就是个Spring,只不过二次开发了
posted @ 2022-03-17 20:38  荧惑微光  阅读(35)  评论(0)    收藏  举报