zoukankan      html  css  js  c++  java
  • Spring中基于注解方式管理bean

    操作步骤

    第一步:导入相关jar包

    spring IoC的基本包

    Spring支持注解的Jar包

    第二步:创建Spring配置文件,ApplicationContext.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">
        
        <!-- 开启注解扫描 
            到包里面扫描类、方法、属性上面是否有注解
        -->
        <context:component-scan base-package="cn.hao"></context:component-scan>
        
    </beans>

    第三步:使用注解方式实现bean管理

    DAO层:

    package cn.hao.dao;
    
    import org.springframework.stereotype.Repository;
    
    // 注解方式创建bean
    @Repository
    public class UserDAO {
    
        public void doAdd() {
            System.out.println("add......");
        }
    }

    Service层:

    package cn.hao.service;
    
    import javax.annotation.Resource;
    
    import org.springframework.stereotype.Service;
    
    import cn.hao.dao.UserDAO;
    
    // 注解方式创建bean
    @Service
    public class UserService {
    
        // 依赖注入
        @Resource
        private UserDAO userDAO;
        
        public void add() {
            this.userDAO.doAdd();
        }
    }

    测试类:

    package cn.hao.test;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import cn.hao.service.UserService;
    
    public class Test {
    
        public static void main(String[] args) {
            
            // 加载Spring配置文件
            ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
            // 获取容器中的bean
            UserService userService = (UserService) context.getBean("userService");
            userService.add();
        }
    }

    创建Bean的的四种注解方式

    1、@Component:标注一个普通的Spring Bean 类

    2、@Controller:标注一个控制器组件类

    3、@Service:标注一个业务逻辑组件类

    4、@Repository:标注一个DAO组件类

    // 指定该类作为Spring Bean,Bean的实例名为service
    @Service("service")
    public class UserService {
        //......
    }

    若创建的Bean实例的名称没指定,默认是Bean类的首字母小写,其他部分不变。

    // 指定该类作为Spring Bean,Bean的实例名默认为userService
    @Service
    public class UserService {
        //......
    }

    指定Bean的作用域的二种注解方式

    1、@Scope("singleton"):单例,不写默认就是这种方式

    2、@Scope("prototype"):多例

    @Service
    @Scope("singleton")
    public class UserService {
    
        // 依赖注入
        @Resource
        private UserDAO userDAO;
        
        public void add() {
            this.userDAO.doAdd();
        }
    }

    Bean中依赖注入的两种方式

    1、@Resource

    2、@Autowired

    @Resource方式注入默认是按名称装配,即一旦设置了name属性,则严格按照名称进行查找装配,若没有对应的Bean,则装配失败。

    @Service
    public class UserService {
    
        // 在Spring容器中找到名称为userDAO的Bean实例注入
        @Resource(name="userDAO") 
        private UserDAO userDAO;
        
        public void add() {
            this.userDAO.doAdd();
        }
    }

    注:如果没有指定name属性,默认的名称和注入的对象名称一样。若仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。 

    @Service
    public class UserService {
    
        // 没有给出name属性,默认名称与要注入的属性名称一样,即userDAO
        @Resource
        private UserDAO userDAO;
        
        public void add() {
            this.userDAO.doAdd();
        }
    }

    @Autowired 默认按类型装配(byType), 例如,@Autowired标注了private UserDAO userDAO,则Spring会自动搜索容器中类型为UserDAO的Bean进行注入。

    @Service
    public class UserService {
    
        // 在容器中搜索类型是UserDAO的实例对象装配
        @Autowired
        private UserDAO userDAO;
        
        public void add() {
            this.userDAO.doAdd();
        }
    }

    但是按类型装配有个很大的缺陷是,如果容器中有不止一个UserDAO类型的实例,则无法正确装配,会抛出异常。可以配合@Qualifier注解,实现按名称装配的效果。

    @Service
    public class UserService {
    
        // 两者结合实现按名称装配的效果
        @Autowired
        @Qualifier("userDAO")
        private UserDAO userDAO;
        
        public void add() {
            this.userDAO.doAdd();
        }
    }
  • 相关阅读:
    docker-compose.yml(2)
    docker-compose.yml(3)
    docker-compose.yml(4)
    生产者&消费者.py
    工作机制.py
    2.5 webpack 进阶
    2.3 Gulp
    2.4 webpack + gulp 构建完整前端工作流
    2.2 webpack
    2.1 前端工程化概述
  • 原文地址:https://www.cnblogs.com/binaway/p/8906576.html
Copyright © 2011-2022 走看看