`
JavaCrazyer
  • 浏览: 3008865 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类

Spring温习(3)--AutoWire自动装配

阅读更多

在应用中,我们常常使用<ref>标签为JavaBean注入它依赖的对象。但是对于一个大型的系统,这个操作将会耗费我们大量的资源,我们不得不花费大量的时间和精力用于创建和维护系统中的<ref>标签。实际上,这种方式也会在另一种形式上增加了应用程序的复杂性,那么如何解决这个问题呢?Spring为我们提供了一个自动装配的机制,尽管这种机制不是很完善,但是在应用中结合<ref>标签还是可以大大的减少我们的劳动强度。前面提到过,在定义Bean时,<bean>标签有一个autowire属性,我们可以通过指定它来让容器为受管JavaBean自动注入依赖对象。

<bean>的autowire属性有如下六个取值,他们的说明如下:

1、 No:即不启用自动装配。Autowire默认的值。

2、 byName:通过属性的名字的方式查找JavaBean依赖的对象并为其注入。比如说类Computer有个属性printer,指定其autowire属性为byName后,Spring IoC容器会在配置文件中查找id/name属性为printer的bean,然后使用Seter方法为其注入。

3、 byType:通过属性的类型查找JavaBean依赖的对象并为其注入。比如类Computer有个属性printer,类型为Printer,那么,指定其autowire属性为byType后,Spring IoC容器会查找Class属性为Printer的bean,使用Seter方法为其注入。

4、 constructor:通byType一样,也是通过类型查找依赖对象。与byType的区别在于它不是使用Seter方法注入,而是使用构造子注入。

5、 autodetect:在byType和constructor之间自动的选择注入方式。

6、 default:由上级标签<beans>的default-autowire属性确定。

注意:在配置bean时,<bean>标签中Autowire属性的优先级比其上级标签高,即是说,如果在上级标签中定义default-autowire属性为byName,而在<bean>中定义为byType时,Spring IoC容器会优先使用<bean>标签的配置。

下面通过一个综合示例来说明这一点

User.java

package com.javacrazyer.domain;


public class User {
	private Long id;
	private String username;
	private String pwd;
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	
	
}

 

UserDao.java

package com.javacrazyer.dao;

import java.io.Serializable;

import com.javacrazyer.domain.User;


public interface UserDao {
	void add(User user);
	void delete(User user);
	void update(User user);
	User findById(Serializable id);
}

 UserDaoHibernateImpl.java

package com.javacrazyer.dao;

import java.io.Serializable;

import com.javacrazyer.domain.User;

public class UserDaoHibernateImpl implements UserDao {

	@Override
	public void add(User user) {
		System.out.println("UserDaoHibernateImpl:add方法");
	}


	@Override
	public void delete(User user) {
		System.out.println("UserDaoHibernateImpl:delete方法");

	}

	@Override
	public User findById(Serializable id) {
		System.out.println("UserDaoHibernateImpl:findById方法");
		return null;
	}

	@Override
	public void update(User user) {
		System.out.println("UserDaoHibernateImpl:update方法");

	}

}

 

UserDaoJDBCImpl.java

package com.javacrazyer.dao;

import java.io.Serializable;

import com.javacrazyer.domain.User;


public class UserDaoJDBCImpl implements UserDao {

	@Override
	public void add(User user) {
		System.out.println("UserDaoJDBCImpl==add方法");

	}

		@Override
	public void delete(User user) {
		System.out.println("UserDaoJDBCImpl==delete方法");

	}

	@Override
	public User findById(Serializable id) {
		System.out.println("UserDaoJDBCImpl==findById方法");
		return null;
	}


	@Override
	public void update(User user) {
		System.out.println("UserDaoJDBCImpl==update方法");

	}

}

 

ServiceFacade.java

package com.javacrazyer.service;

import com.javacrazyer.dao.UserDao;
import com.javacrazyer.domain.User;


public class ServiceFacade {
	
	//依赖的对象:主动去获取
	private UserDao userDao;
	
	public ServiceFacade(){}
	
	//构造器
	public ServiceFacade(UserDao userDao){
		this.userDao = userDao;
		
		System.out.println("调用带UserDao参数的构造方法");
	}
	
	//set方法
	public void setUserDao(UserDao userDao){
		this.userDao = userDao;
	}
	
	
	public void addUser(User user){
		userDao.add(user);
	}
	
	public User findById(Long id){
		return userDao.findById(id);
	}
}

 

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:aop="http://www.springframework.org/schema/aop"
		xmlns:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="
			http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
	
<!--	<bean id="userDao" class="com.javacrazyer.dao.UserDaoHibernateImpl"/>-->
	<bean id="userDao" class="com.javacrazyer.dao.UserDaoJDBCImpl"/>
              <!--自动装配	-->
	<bean id="sf" class="com.javacrazyer.service.ServiceFacade" autowire="autodetect" />
	
<!--	<bean id="sf" class="com.javacrazyer.service.ServiceFacade" >-->
<!--	<property name="userDao"  ref="userDao"/>-->
<!--	</bean>-->
</beans>

 

测试类

package com.javacrazyer.service.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.javacrazyer.domain.User;
import com.javacrazyer.service.ServiceFacade;


public class UserServiceTest {

	@Test
	public void testAddUser(){
		
		//从Spring的Bean容器中获取想要的实例
		//BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
		//ServiceFacade sf = (ServiceFacade)factory.getBean("sf"); 

		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		ServiceFacade sf = (ServiceFacade)context.getBean("sf");
		
		sf.addUser(new User());
	}
}

 

结果是

 UserDaoJDBCImpl==add方法

如果将bean的id为UserDao的换成hibernate实现方式,那么结果就会是

UserDaoHibernateImpl==add方法

所以,在自动装配中无需像这样

<bean id="sf" class="com.javacrazyer.service.ServiceFacade" >
 <property name="userDao"  ref="userDao"/>
 </bean>

配置引用注入对象

 

总结:

自动装配并不是十全十美的,我们不论是使用byName还是byType的方法,Spring不一定就能很准确的为我们找到JavaBean依赖的对象。另外,如果使用自动装配,Spring配置文件的可读性也大大降低,我们不能很容易的看出个bean之间的依赖关系,这也在一定程度上降低了程序可维护性。因此在使用自动装配时,应当权衡利弊,合理的与ref的方法相结合,尽量在降低工作量的同时,保证应用的可维护度。

3
0
分享到:
评论

相关推荐

    spring-autowire-demo.zip

    本示例"spring-autowire-demo.zip"是基于Spring 5.3.6版本,通过多个示例展示了自动装配的不同方式:default、byName、byType和constructor,帮助我们更深入理解这个功能。 首先,让我们了解什么是自动装配。自动...

    Spring-Framework-Notes-For-Professionals.pdf

    - Spring提供了自动装配功能,允许开发者通过注解自动配置Bean的依赖关系。 - 可以通过使用@Qualifier注解或泛型参数来自动装配特定类型的Bean。 - 使用FactoryBean可以动态创建Bean实例。 - 也可以声明性地定义...

    Spring实现自动装配

    3. **基于名称的自动装配(By Name Auto-Wiring)**:Spring会查找与目标bean的属性名相同的bean并注入。在XML配置中,可以使用`autowire="byName"`开启此功能。 4. **基于注解的自动装配(Annotation-Based Auto-...

    storm-spring-autowire:使storm支持spring的注入功能

    storm-spring-autowire 使storm支持spring的注入功能 由于storm的生命周期如下 1.在提交了一个topology之后(是在nimbus所在的机器么?), 创建spout/bolt实例(spout/bolt在storm中统称为component)并进行序列化. 2.将...

    Spring自动装配解析

    在Spring的XML配置文件中,可以通过`&lt;beans&gt;`标签的`autowire`属性来全局设置自动装配策略,或者在单个`&lt;bean&gt;`标签中通过`autowire`属性指定某一个bean的自动装配方式。 4. 使用注解进行自动装配 Spring 2.5引入了...

    spring-autowire.zip

    《Spring自动装配详解——基于IDEA 2020的小实例》 在Java开发领域,Spring框架以其强大的功能和灵活性,成为了企业级应用开发的首选。其中,Spring的自动装配特性(Autowired)是其核心特性之一,极大地简化了依赖...

    spring-cloud-kubernetes:Kubernetes与Spring Cloud的集成

    该项目已移至 。 Spring Cloud Kubernetes 与集成 特征 (无论代码在Kubernetes内还是外部运行,它都是透明的) Kubernetes的DiscoveryClient 该项目提供了的的。 这使您可以按名称查询... @Autowire private Discov

    grpc-jwt-spring-boot-starter:具有JWT授权的gRPC框架的Spring Boot Starter

    具有Spring Boot Starter-gRPC Java JWT 使用Auth模块扩展出色的。 使用类似于Spring Security模块中使用的简单注释的简单实现。 快速开始 (尝试示例项目:Kotlin中的。) 简单的开始仅由3个简单的步骤组成。 ...

    spring自动装配

    在压缩包文件名称“spring_0700_IOC_Autowire”中,“IOC”代表“Inversion of Control”,即控制反转,它是Spring的核心概念之一,自动装配是IOC的一种实现方式。这个文件可能包含了关于Spring自动装配的教程材料,...

    autowire自动导入句柄

    在Spring框架中,`autowire`是一种自动装配bean依赖的方式,它极大地简化了bean之间的依赖注入过程。本文将深入探讨`autowire`自动导入句柄及其在实际开发中的应用。 ### 1. `autowire`简介 `autowire`是Spring...

    开发工具 spring-beans-4.3.6.RELEASE.rar

    - 可以通过`autowire`属性来设置自动装配策略,如`byName`和`byType`。 6. **AOP(面向切面编程)**: - Spring提供了基于代理的AOP实现,允许开发者定义切面,进行横切关注点(如日志、事务管理)的处理。在...

    Spring的自动装配源代码

    在Spring框架中,自动装配(Auto-Wiring)是一种简化配置的方式,它允许Spring容器自动为Bean提供依赖。这种特性使得开发者无需显式地在XML配置文件中声明Bean之间的依赖关系,从而减少了配置工作量,提高了代码的可...

    spring02-3

    在文件"1606SpringDay02-3"中,可能包含了对这些概念的详细讲解和示例代码,通过学习这部分内容,我们可以更深入地理解Spring如何管理和装配bean,从而更好地设计和构建Spring应用。同时,合理使用`parent`、`...

    Spring中的Quartz配置-Spring-定时器-java定时器.doc

    &lt;bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"&gt; ``` `startQuertz`bean会启动并管理Quartz调度器,`triggers`属性的...

    Spring--2.Spring 中的 Bean 配置-2-1

    - Spring提供了两种自动装配方式:byName和byType。byName根据属性名匹配Bean,byType根据属性类型匹配Bean。 - 使用`autowire`属性可以开启自动装配,例如: ```xml ...

    3Spring使用annotation方式autowire

    本篇将详细探讨"3Spring使用annotation方式autowire"这一主题,包括注解驱动的自动装配(Autowiring)以及相关的源码分析。 ### 一、注解驱动的自动装配 自动装配是Spring框架的一个核心特性,它允许框架自动管理...

    Spring自动装配模式表

    ### Spring自动装配模式详解 #### 一、引言 在Spring框架中,自动装配是一种非常实用的功能,可以简化Bean的依赖注入过程。Spring提供了多种自动装配模式,每种模式都有其适用场景。本文将详细介绍Spring框架中的...

    Spring的Autowired自动装配(XML版本+Annotation版本+源码+解析)

    本篇将重点讲解Spring的@Autowired自动装配机制,包括XML配置版和注解版,并深入到源码层面进行解析。 @Autowired是Spring框架中的一个核心注解,用于实现自动装配bean的需求。当我们想要在类中注入某个依赖时,...

    自动装配 AutoWire

    **自动装配(Autowired)是Spring框架中的一个重要特性,它允许我们自动将依赖注入到bean中,而无需显式地在配置文件中指定依赖关系。在本文中,我们将深入探讨Autowired的工作原理、使用方式以及它如何简化Java应用的...

    Spring中自动装配的4种方式

    byName 自动装配是指通过设置 property 标签的 autowire 属性为 byName,Spring 将自动寻找一个与该属性名称相同或 id 相同的 Bean,注入进来。例如: ```xml &lt;property name="dataSource" autowire="by...

Global site tag (gtag.js) - Google Analytics