zoukankan      html  css  js  c++  java
  • Spring学习十----------Bean的配置之Autowired注解实现

    © 版权声明:本文为博主原创文章,转载请注明出处

    @Required

    -@Required注解适用于bean属性的setter方法

    -这个注解仅仅表示,受影响的bean属性必须在配置时被填充,通过在bean定义或通过自动装配一个明确的属性值

    @Autowired

    -可以将@Autowired注解为“传统”的setter方法

    -可用于构造器或成员变量

    -默认情况下,如果因找不到合适的bean将会导致autowiring失败跑出异常,可通过@Autowired(required=false)避免

    -每个类只能有一个构造器被标记为required=true

    -@Autowired的必要属性,建议使用@Required注解

    -可以通过添加注解给需要该类型的数组的字段或方法,以提供ApplicationContext中所有特定类型的bean

    -可以用于装配key为String的Map

    -如果希望数组有序,可以让bean实现org.springframework.core.Ordered接口或使用@Order注解

    -@Autowired是由Spring BeanPostProcessor处理的,所以不能再自己的BeanPostProcessor或BeanFactoryPostProcessor类型应用这些注解,这些类型必须通过XML或者Spring的  @Bean注解加载

    @Qualifier

    -按类型自动装配可能多个bean实例的情况,可以使用使用Spring的@Qualifier注解缩小范围(或指定唯一),也可以用于指定单独的构造器参数或方法参数

    -可用于注解集合类型变量

    @Resource

    -通过其独特的名称来定义识别特定的目标(这是一个与所声明的类型无关的匹配过程)

    -因语义差异,集合和Map类型的bean无法通过@Autowired来注入,因为没有类型匹配到这样的bean,为这些bean使用@Resource注解,通过唯一名称引用集合或Map的bean

    实例:

    1.项目结构

    2.pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    
    	<modelVersion>4.0.0</modelVersion>
      
    	<groupId>org.springautowired</groupId>
    	<artifactId>Spring-Autowired</artifactId>
    	<packaging>war</packaging>
    	<version>0.0.1-SNAPSHOT</version>
    	<name>Spring-Autowired Maven Webapp</name>
    	<url>http://maven.apache.org</url>
    	
    	<properties>
    		<spring.version>4.3.8.RELEASE</spring.version>
    	</properties>
    	
    	<dependencies>
    		<!-- junit依赖 -->
    		<dependency>
    			<groupId>junit</groupId>
    			<artifactId>junit</artifactId>
    			<version>4.12</version>
    			<scope>test</scope>
    		</dependency>
    		<!-- spring核心依赖 -->
    		<dependency>
    		    <groupId>org.springframework</groupId>
    		    <artifactId>spring-core</artifactId>
    		    <version>${spring.version}</version>
    		</dependency>
    		<dependency>
    		    <groupId>org.springframework</groupId>
    		    <artifactId>spring-beans</artifactId>
    		    <version>${spring.version}</version>
    		</dependency>
    		<dependency>
    		    <groupId>org.springframework</groupId>
    		    <artifactId>spring-context</artifactId>
    		    <version>${spring.version}</version>
    		</dependency>
    	</dependencies>
    	
    	<build>
    		<finalName>Spring-Autowired</finalName>
    	</build>
    	
    </project>
    

    3.spring-autowired.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">
            
        <!-- 开启包扫描将Bean加载到IOC容器中 -->
      <context:component-scan base-package="org.springautowired.*"/>        
            
    </beans>

     4.BeanDao.java

    package org.springautowired.dao;
    
    public interface BeanDao {
    
    	public void save(String key);
    	
    }
    

    5.BeanDaoImpl.java

    package org.springautowired.dao.impl;
    
    import org.springautowired.dao.BeanDao;
    import org.springframework.stereotype.Repository;
    
    @Repository
    public class BeanDaoImpl implements BeanDao {
    
    	public void save(String key) {
    		
    		System.out.println("BeanDaoImpl保存成功,保存的数据为:" + key);
    		
    	}
    
    }
    

    6.BeanService.java

    package org.springautowired.service;
    
    public interface BeanService {
    
    	public void save(String key);
    	
    }
    

    7.BeanServiceImpl.java

      7.1 注解在成员变量上

    package org.springautowired.service.impl;
    
    import org.springautowired.dao.BeanDao;
    import org.springautowired.service.BeanService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class BeanServiceImpl implements BeanService {
    
    	@Autowired
    	private BeanDao beanDao;
    	
    	public void save(String key) {
    		
    		System.out.println("BeanServiceImpl接受参数:" + key);
    		beanDao.save(key);
    		
    	}
    	
    }

      7.2 注解在构造器上

    package org.springautowired.service.impl;
    
    import org.springautowired.dao.BeanDao;
    import org.springautowired.service.BeanService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class BeanServiceImpl implements BeanService {
    
    	private BeanDao beanDao;
    
    	@Autowired
    	public BeanServiceImpl(BeanDao beanDao) {
    		this.beanDao = beanDao;
    	}
    
    	public void save(String key) {
    		
    		System.out.println("BeanServiceImpl接受参数:" + key);
    		beanDao.save(key);
    		
    	}
    	
    }

      7.3 注解在setter方法上

    package org.springautowired.service.impl;
    
    import org.springautowired.dao.BeanDao;
    import org.springautowired.service.BeanService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class BeanServiceImpl implements BeanService {
    
    	private BeanDao beanDao;
    	
    	@Autowired
    	public void setBeanDao(BeanDao beanDao) {
    	    this.beanDao = beanDao;
    	}
    
    	public void save(String key) {
    		
    		System.out.println("BeanServiceImpl接受参数:" + key);
    		beanDao.save(key);
    		
    	}
    	
    }
    

    8.BeanController.java

      8.1 注解在成员变量上

    package org.springautowired.controller;
    
    import org.springautowired.service.BeanService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    
    @Controller
    public class BeanController {
    	
    	@Autowired
    	private BeanService beanService;
    
    	public void save(String key) {
    		
    		System.out.println("BeanController开始执行插入方法");
    		beanService.save(key);
    		
    	}
    	
    }

      8.2 注解在构造器上

    package org.springautowired.controller;
    
    import org.springautowired.service.BeanService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    
    @Controller
    public class BeanController {
    	
    	private BeanService beanService;
    	
    	@Autowired
    	public BeanController(BeanService beanService) {
    		this.beanService = beanService;
    	}
    
    	public void save(String key) {
    		
    		System.out.println("BeanController开始执行插入方法");
    		beanService.save(key);
    		
    	}
    	
    }

      8.3 注解在setter方法上

    package org.springautowired.controller;
    
    import org.springautowired.service.BeanService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    
    @Controller
    public class BeanController {
    	
    	private BeanService beanService;
    	
    	@Autowired
    	public void setBeanService(BeanService beanService) {
    		this.beanService = beanService;
    	}
    
    	public void save(String key) {
    		
    		System.out.println("BeanController开始执行插入方法");
    		beanService.save(key);
    		
    	}
    	
    }
    

    9.BeanInterface.java

    package org.springautowired.mutil;
    
    public interface BeanInterface {
    
    }
    

    10.BeanInterfaceImpl1.java

    package org.springautowired.mutil;
    
    import org.springframework.core.annotation.Order;
    import org.springframework.stereotype.Component;
    
    @Order(2)
    @Component
    public class BeanInterfaceImpl1 implements BeanInterface {
    
    }
    

    11.BeanInterfaceImpl2.java

    package org.springautowired.mutil;
    
    import org.springframework.core.annotation.Order;
    import org.springframework.stereotype.Component;
    
    @Order(1)
    @Component
    public class BeanInterfaceImpl2 implements BeanInterface {
    
    }
    

    12.MultiBean.java

    package org.springautowired.mutil;
    
    import java.util.List;
    import java.util.Map;
    
    import javax.annotation.Resource;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Component;
    
    @Component
    public class MultiBean {
    
    	//使用@Autowired将所有实现BeanInterface接口的类放入list中,可用@Order指定顺序
    	@Autowired
    	private List<BeanInterface> list;
    	
    	//使用@Autowired将所有实现BeanInterface接口的类放入map中,bean ID作为key
    	@Autowired
    	private Map<String, BeanInterface> map;
    	
    	//使用@Qualifier缩小范围(指定唯一)
    	@Autowired
    	@Qualifier("beanInterfaceImpl2")
    	private BeanInterface beanInterface;
    	
    	//@Resource通过名字注入,与上一样
    	@Resource
    	private BeanInterface beanInterfaceImpl2;
    	
    	public void say() {
    		
    		if(list != null && list.size() > 0) {
    			System.out.println("list...");
    			for(BeanInterface bean: list) {
    				System.out.println(bean.getClass().getName());
    			}
    		}else{
    			System.out.println("List<BeanInterface> is null");
    		}
    		
    		if(map != null && map.size() > 0) {
    			System.out.println("map...");
    			for(String key: map.keySet()){
    				System.out.println(key + "   " + map.get(key).getClass().getName());
    			}
    		}else{
    			System.out.println("Map<String, BeanInterface> is null");
    		}
    		
    		System.out.println("@Qualifier...");
    		if(beanInterface != null){
    			System.out.println(beanInterface.getClass().getName());
    		}else{
    			System.out.println("beanInterface is null");
    		}
    		
    		System.out.println("@Resource...");
    		if(beanInterfaceImpl2 != null){
    			System.out.println(beanInterfaceImpl2.getClass().getName());
    		}else{
    			System.out.println("beanInterfaceImpl2 is null");
    		}
    		
    	}
    	
    }
    

    13.TestBase.java

    package org.springautowired.test;
    
    import org.junit.After;
    import org.junit.Before;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.util.StringUtils;
    
    public class TestBase {
    
    	private ClassPathXmlApplicationContext context;
    	private String springXmlPath;
    	
    	/**
    	 * 无参构造器
    	 */
    	public TestBase() {
    
    	}
    	
    	/**
    	 * 含参构造器,初始化spring配置文件路径
    	 * 
    	 * @param springXmlPath
    	 * 						spring配置文件路径
    	 */
    	public TestBase(String springXmlPath) {
    
    		this.springXmlPath = springXmlPath;
    		
    	}
    	
    	/**
    	 * 初始化spring配置文件到IOC容器中
    	 */
    	@Before
    	public void before() {
    		
    		if(StringUtils.isEmpty(springXmlPath)){//默认spring配置文件路径
    			springXmlPath = "classpath:spring-*.xml";
    		}
    		context = new ClassPathXmlApplicationContext(springXmlPath.split("[,\s]+"));
    		context.start();
    		
    	}
    	
    	/**
    	 * 销毁IOC容器
    	 */
    	@After
    	public void after() {
    		
    		if(context != null) {
    			context.destroy();
    		}
    		
    	}
    	
    	/**
    	 * 通过bean ID获取bean对象
    	 * 
    	 * @param beanId
    	 * 					bean ID
    	 * @return
    	 */
    	public Object getBean(String beanId) {
    		
    		return context.getBean(beanId);
    		
    	}
    	
    }
    

    14.TestSpringAutowired.java

    package org.springautowired.test;
    
    import org.junit.Test;
    import org.springautowired.controller.BeanController;
    import org.springautowired.mutil.MultiBean;
    
    public class TestSpringAutowired extends TestBase {
    
    	/**
    	 * 构造函数初始化spring配置文件
    	 */
    	public TestSpringAutowired() {
    		
    		super("classpath:spring-autowired.xml");
    		
    	}
    
    	/**
    	 * 测试@autowired在成员变量、构造器和setter方法上
    	 */
    	@Test
    	public void testAutoWired() {
    		
    		BeanController beanController = (BeanController) super.getBean("beanController");
    		beanController.save("test");
    		
    	}
    	
    	/**
    	 * 测试@Autowired装配指定类型的数组和key为String的Map
    	 */
    	@Test
    	public void testAutoWired2() {
    		
    		MultiBean bean = (MultiBean) super.getBean("multiBean");
    		bean.say();
    		
    	}
    	
    }
    

    15.效果预览

    参考:http://www.imooc.com/video/4031

       http://www.imooc.com/video/4032

       http://www.imooc.com/video/4160

  • 相关阅读:
    【BZOJ5298】【CQOI2018】交错序列(矩阵快速幂优化dp)
    【BZOJ5297】【CQOI2018】社交网络(有向图生成树计数)
    【BZOJ5296】【CQOI2018】破解D-H协议(BSGS)
    【BZOJ1185】【HNOI2007】最小矩形覆盖(凸包+旋转卡壳)
    【BZOJ1069】【SCOI2007】—最大土地面积(凸包+旋转卡壳)
    【BZOJ2300】【HAOI2011】—防线修建(set维护动态凸包)
    【POJ1912】【Ceoi2002】—A highway and the seven dwarfs(凸包)
    【BZOJ1043】【HAOI2008】—下落的圆盘(圆的并集)
    node-多进程
    Node-RESTful
  • 原文地址:https://www.cnblogs.com/jinjiyese153/p/6756494.html
Copyright © 2011-2022 走看看