• IOC容器bean管理---注解方式


    1. 注解概念

    1. 注解是代码特殊标记,格式:@注解名称(属性名称=属性值, 属性名称=属性值…)
    2. 使用注解,注解作用在类上面,方法上面,属性上面
    3. 使用注解目的:简化 xml 配置

    Spring中提供了4种注解:

    • @Component: 组件bean
    • @Service: 服务层bean
    • @Controller: 控制器bean
    • @Repository: 数据访问层bean

    上面四个注解功能是一样的,都可以用来创建 bean 实例,名字不同是为了开发时便于逻辑区分


    2. 代码示例

    引入以下jar包:
    在这里插入图片描述
    引入context命名空间
    在这里插入图片描述

    在xml文件中开启注解扫描:

    <!--    有多个包需要开启注解扫描时,可以中间使用逗号分割-->
        <context:component-scan base-package="cn.edu.xd.dao,cn.edu.xd.bean"/>
    
    • 1
    • 2

    细化扫描方式1:

    <context:component-scan base-package="cn.edu.xd" use-default-
    filters="false">
    <context:include-filter type="annotation"
    expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    表示只扫描cn.edu.xd包下面的类中的@Controller注解
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    细化扫描方式2:

    <context:component-scan base-package="cn.edu.xd" use-default-
    filters="false">
    <context:exclude-filter type="annotation"
    expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    表示不扫描cn.edu.xd包下面的类中的@Controller注解,其他注解都扫描
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    package cn.edu.xd.dao;
    
    import org.springframework.stereotype.Repository;
    
    @Repository(value = "userDao")
    public class UserDao {
    
        public void add(){
            System.out.println("UserDao add...");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
     @Test
        public void test1(){
            ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");//加载文件
            UserDao userDao=context.getBean("userDao",UserDao.class);
            userDao.add();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3. 注解方式实现属性注入

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

    package cn.edu.xd.dao;
    
    import org.springframework.stereotype.Repository;
    
    @Repository(value = "userDao")
    public class UserDao {
    
        public void add(){
            System.out.println("UserDao add...");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    package cn.edu.xd.service;
    
    import cn.edu.xd.dao.UserDao;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service(value = "userService")  // <bean id="userService" class="..."/>
    //value值如果省略 默认是类名首字母小写  比如类型AAAA value默认值就说aAAA
    public class UserService {
        @Autowired
        UserDao userDao;
    
        //不需要set方法
    //    public void setUserDao(UserDao userDao) {
    //        this.userDao = userDao;
    //    }
    
        public void add(){
            System.out.println("UserService add...");
            userDao.add();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
     @Test
        public void test1(){
            ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");//加载文件
            UserService userService=context.getBean("userService",UserService.class);
            userService.add();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    2. @Qualifier:根据名称进行注入
    @Qualifier 注解的使用,和上面@Autowired 一起使用

    @Autowired 是根据类型进行匹配,当有多个类型匹配时,就需要根据@Qualifier确定是哪一个实例bean

    package cn.edu.xd.dao;
    
    public interface UserDao {
        public void add();
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    package cn.edu.xd.dao;
    
    import org.springframework.stereotype.Repository;
    
    @Repository
    public class UserDaoImpl1 implements UserDao {
    
        @Override
        public void add() {
            System.out.println("UserDaoImpl1 add...");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    package cn.edu.xd.dao;
    
    import org.springframework.stereotype.Repository;
    
    @Repository
    public class UserDaoImpl2 implements UserDao {
    
        @Override
        public void add() {
            System.out.println("UserDaoImpl2 add...");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    package cn.edu.xd.service;
    
    import cn.edu.xd.dao.UserDao;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service(value = "userService")  // <bean id="userService" class="..."/>
    //value值如果省略 默认是类名首字母小写  比如类型AAAA value默认值就说aAAA
    public class UserService {
        @Autowired
        UserDao userDao;
    
        //不需要set方法
    //    public void setUserDao(UserDao userDao) {
    //        this.userDao = userDao;
    //    }
    
        public void add(){
            System.out.println("UserService add...");
            userDao.add();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    此时如果 UserService类中不加@Qualifier 注解,就会报错,因为UserDao类型的bean有两个

    	@Autowired
        @Qualifier(value = "userDaoImpl1")
        UserDao userDao;
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    	@Autowired
        @Qualifier(value = "userDaoImpl2")
        UserDao userDao;
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    3. @Resource:可以根据类型注入,可以根据名称注入

    //根据类型注入
     @Resource
        UserDao userDao;
    
    • 1
    • 2
    • 3
    //根据名称注入
     @Resource(name="userDaoImpl1)
        UserDao userDao;
    
    • 1
    • 2
    • 3

    4. @Value:注入普通类型属性

    @Component
    public class User {
        @Value("tom")
        String name;
        @Value("18")
        int age;
    
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    4. 纯注解开发

    不使用xml配置文件,前面开启注解扫描还需要在xml文件中配置

    创建一个配置类:

    @Configuration //表示是配置类 相当于bean.xml
    @ComponentScan(basePackages = {"cn.edu.xd"})  //表示对哪些包进行扫描
    public class SpringConfig {
    }
    
    • 1
    • 2
    • 3
    • 4
     @Test
        public void test1(){
           ApplicationContext context=new AnnotationConfigApplicationContext(SpringConfig.class);//加载文件
            User user=context.getBean("user",User.class);
            System.out.println(user);
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    test方法中加载的是SpringConfig这个配置类,不再是之前的bean.xml文件

  • 相关阅读:
    关于对四维空间一些理解
    dcatadmin批量操作时异步请求获取当前选中的id
    千呼万唤始出来,从源码到架构的Spring全系列笔记,已全部完毕
    017-JAVA重载及实例讲解
    GD32F4xx GCC编译
    RunApi使用详解
    网站如何判断请求是来自手机-移动端还是PC-电脑端?如何让网站能适应不同的客户端?
    Qt制作dll并调用,以及解决QWidget: Must construct a QApplication before a QWidget
    用QT实现一个简单的桌面宠物
    工程伦理与学术道德
  • 原文地址:https://blog.csdn.net/qq_43478694/article/details/125460355