• Spring学习七----------Bean的配置之自动装配


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

    Bean的自动装配(Autowiring)

    no:不启用自动装配,此时需要手动注入。参考:Spring学习三----------注入方式

    default:优先执行constructor,然后byType,最后byName

    byName:根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配

    byType:如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配;如果存在多个该类型bean,那么跑出异常,并指出不能使用byType方式进行自动装配;如果没有找到相匹配的bean,则说明事都不发生

    constructor:与byType方式类似,不同之处在于它应用于构造器参数。如果容器中没有找到与构造器参数类型一致的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.springbean</groupId>
    	<artifactId>Spring-AutoAssemble</artifactId>
    	<packaging>jar</packaging>
    	<version>0.0.1-SNAPSHOT</version>
    	<name>Spring-AutoAssemble Maven Webapp</name>
    	<url>http://maven.apache.org</url>
    	
    	<properties>
    		<spring.version>4.3.7.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-AutoAssemble</finalName>
    	</build>
    </project>
    

    3.AutowiringDao.java

    package org.spring.autowiring.dao;
    
    public interface AutowiringDao {
    
    	public void say(String word);
    	
    }
    

    4.AutowiringDaoImpl.java

    package org.spring.autowiring.dao.impl;
    
    import org.spring.autowiring.dao.AutowiringDao;
    
    public class AutowiringDaoImpl implements AutowiringDao {
    
    	public void say(String word) {
    		
    		System.out.println("AutowiringDaoImpl接受参数:" + word);
    
    	}
    
    }
    

    5.AutowiringService.java

    package org.spring.autowiring.service;
    
    public interface AutowiringService {
    
    	public void say(String word);
    	
    }
    

    6.AutowiringServiceImpl.java

      6.1 byName和byType

    package org.spring.autowiring.service.impl;
    
    import org.spring.autowiring.dao.AutowiringDao;
    import org.spring.autowiring.service.AutowiringService;
    
    public class AutowiringServiceImpl implements AutowiringService {
    	
    	//byName时,必须与bean配置的id一致;byType时,可随意命名。本次修改bean的id,不再修改该属性名;效果一样
    	private AutowiringDao autowiringDao;
    
    	/**
    	 * (byName和byType)只需setter方法
    	 * @param autowiringDao
    	 */
    	public void setAutowiringDao(AutowiringDao autowiringDao) {
    		
    		this.autowiringDao = autowiringDao;
    		
    	}
    
    	public void say(String word) {
    
    		System.out.println("AutowiringServiceImpl接受参数:" + word);
    		autowiringDao.say(word);
    		
    	}
    
    }
    

      6.2 constructor

    package org.spring.autowiring.service.impl;
    
    import org.spring.autowiring.dao.AutowiringDao;
    import org.spring.autowiring.service.AutowiringService;
    
    public class AutowiringServiceImpl implements AutowiringService {
    	
    	private AutowiringDao autowiringDao;
    	
    	/**
    	 * constructor时存在;byName和byType时存在会报错
    	 * 
    	 * @param autowiringDao
    	 */
    	public AutowiringServiceImpl(AutowiringDao autowiringDao) {
    		
    		this.autowiringDao = autowiringDao;
    		
    	}
    
    	public void say(String word) {
    
    		System.out.println("AutowiringServiceImpl接受参数:" + word);
    		autowiringDao.say(word);
    		
    	}
    
    }
    

    7.spring-autowiring.xml(三选一)

      7.1 byName

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd"
            default-autowire="byName">
            
        <bean id="autowiringService" class="org.spring.autowiring.service.impl.AutowiringServiceImpl"/>
    
        <bean id="autowiringDao" class="org.spring.autowiring.dao.impl.AutowiringDaoImpl"/>
            
    </beans>
    

      7.2 byType和constructor

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd"
            default-autowire="byType">
            
        <bean id="autowiringService" class="org.spring.autowiring.service.impl.AutowiringServiceImpl"/>
    
        <bean class="org.spring.autowiring.dao.impl.AutowiringDaoImpl"/>
            
    </beans>
    

    8.JunitTestBase.java

    package org.spring.autowiring.test;
    
    import org.junit.After;
    import org.junit.Before;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.util.StringUtils;
    
    /**
     * 单元测试基类
     *
     */
    public class JunitTestBase {
    
    	private ClassPathXmlApplicationContext context;
    	private String springXmlPath;
    	
    	/**
    	 * 无参构造器,使用此构造器创建对象,使用默认spring配置文件
    	 */
    	public JunitTestBase() {
    
    	}
    
    	/**
    	 * 含参构造器,初始化spring配置文件路径
    	 * 
    	 * @param springXmlPath
    	 * 							spring配置文件路径
    	 */
    	public JunitTestBase(String springXmlPath) {
    		
    		this.springXmlPath = springXmlPath;
    		
    	}
    	
    	/**
    	 * 启动spring容器,在@Test方法执行之前执行
    	 */
    	@Before
    	public void start() {
    		
    		if(StringUtils.isEmpty(springXmlPath)) {//设置默认spring配置文件路径
    			springXmlPath = "classpath:spring-*.xml";
    		}
    		//加载spring配置文件到spring容器中
    		context = new ClassPathXmlApplicationContext(springXmlPath.split("[,\s]+"));
    		//启动spring容器,并扩散启动信号到该容器下的所有组件
    		context.start();
    		
    	}
    	
    	/**
    	 * 销毁spring容器,在@Test方法执行之前执行
    	 */
    	@After
    	public void stop() {
    		
    		if(context != null){
    			context.destroy();
    		}
    		
    	}
    	
    	/**
    	 * 通过bean id获取bean对象
    	 * 
    	 * @param beanId
    	 * 					bean id
    	 * @return
    	 */
    	public Object getBean(String beanId) {
    		
    		return context.getBean(beanId);
    		
    	}
    	
    }
    

    9.TestAutowiring.java

    package org.spring.autowiring.test;
    
    import org.junit.Test;
    import org.spring.autowiring.service.AutowiringService;
    
    public class TestAutowiring extends JunitTestBase {
    
    	/**
    	 * 通过构造器传递spring配置文件路径
    	 */
    	public TestAutowiring() {
    		
    		super("classpath:spring-autowiring.xml");
    		
    	}
    	
    	@Test
    	public void testAutowiring() {
    		
    		AutowiringService autowiringService = 
    					(AutowiringService) super.getBean("autowiringService");
    		autowiringService.say("test");
    		
    	}
    	
    	
    }
    

    10.效果预览

      10.1 byName或byType(AutowiringServiceImpl.java中含有自定义构造器时)

      10.2 byName(AutowiringServiceImpl.java中不含有自定义构造器时)

      10.3 byType(spring-autowiring.xml中dao层配置的bean中id不存在时)

      10.4 byType(spring-autowiring.xml中dao层配置的bean中id存在时)---只是样式不一样而已。。。

       10.5 constructor

    更多测试情况,可自行测试。

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

  • 相关阅读:
    Linux日志文件/var/log详解
    QT 的信号与槽机制介绍
    利用线程通信,写2个线程,一个线程打印1~52,另一个线程打印A~Z,打印顺序应该使12A34B56C···5152Z
    mysql快速安装
    zabbix安装源
    mysql手动安装
    没有可用软件包 zabbixservermysql
    【转载】web 部署专题(一):Gunicorn运行与配置方法
    supervisor快速配置
    linux监控脚本状态失败后拉起
  • 原文地址:https://www.cnblogs.com/jinjiyese153/p/6705349.html
Copyright © 2020-2023  润新知