- 浏览: 3009063 次
- 性别:
- 来自: 河南
文章分类
- 全部博客 (340)
- Java综合 (26)
- 程序人生 (53)
- RIA-ExtJS专栏 (18)
- RIA-mxGraph专栏 (4)
- RIA-Flex4专栏 (43)
- 框架-Spring专栏 (16)
- 框架-持久化专栏 (22)
- 框架-Struts2专栏 (11)
- 框架-Struts专栏 (12)
- SQL/NOSQL (12)
- 报表/图表 (2)
- 工作流 (5)
- XML专栏 (4)
- 日常报错解决方案 (5)
- Web前端-综合 (12)
- Web/JSP (14)
- Web前端-ajax专栏 (14)
- Web前端-JQuery专栏 (9)
- IDE技巧 (6)
- FILE/IO (14)
- 远程服务调用 (2)
- SSO单点登录 (2)
- 资源分享 (22)
- 云计算 (1)
- 项目管理 (3)
- php专栏 (1)
- Python专栏 (2)
- Linux (1)
- 缓存系统 (1)
- 队列服务器 (1)
- 网络编程 (0)
- Node.js (1)
最新评论
-
hui1989106a:
我的也不能解压,360和好压都试了,都不行
《Spring in Action》完整中文版分享下载 -
temotemo:
这些example有些过时了,官方建议使用HBase-1.0 ...
Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询 -
zy8102:
非常感谢~
HeadFirst系列之七:《深入浅出SQL》原版高清PDF电子书分享下载 -
zy8102:
重命名了一下搞定了
HeadFirst系列之七:《深入浅出SQL》原版高清PDF电子书分享下载 -
zy8102:
为什么下载以后老解压不了呢?
HeadFirst系列之七:《深入浅出SQL》原版高清PDF电子书分享下载
在应用中,我们常常使用<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的方法相结合,尽量在降低工作量的同时,保证应用的可维护度。
发表评论
-
Spring温习(9)--配置hibernate信息
2010-11-04 09:45 3115有时候为了为了操作方便,我们时常在spring整合hibern ... -
Spring温习(8)--国际化的支持
2010-11-03 11:07 3787我今天介绍的国际化呢,平时基本上都用不上,我的项目中也从来没用 ... -
Spring温习(7)--有关定时任务Quartz的示例
2010-11-02 23:07 2826实际项目中有关定时任务的使用还是比较普遍的,比如定时做报表,定 ... -
Spring温习(6)--邮件发送实现
2010-10-28 21:55 7673Spring对邮件发送支持的很好,我们只要配置好邮件发送器,写 ... -
Spring温习(5)--CGLIB的动态代理[附AOP内部实现讲解]
2010-10-27 14:55 8882这篇文章紧接着上一篇静态代理和动态代理来说 前言: 到现在 ... -
Spring温习(4)--静态代理和动态代理
2010-10-27 11:27 3338代理模式分为静态代理和动态代理。静态代理就是我们自己定义的代理 ... -
Spring温习(2)--IOC容器
2010-10-27 09:10 30481. Spring IoC的依赖注入 1) 使用构造方法来注入 ... -
Spring温习(1)--最基础的示例
2010-10-26 21:37 3493从现在开始,我将从Spring为起点,逐步复习几大框架各方面的 ... -
Spring事务管理的两种方式
2010-10-26 17:27 4031目前项目开发过程中对于Spring的事务管理,主要就这么两种方 ... -
Spring数据源配置的三种方式
2010-10-26 15:25 3782spring数据源配置目前确切的说应该分为:spring容器自 ... -
Spring AOP的两种实现方式
2010-10-26 11:18 5835AOP常用实现方式是一个采用声明的方式来实现,一个采用注解的方 ... -
Spring AOP原理及拦截器
2010-10-26 10:38 147910原理 AOP(Aspect Oriented Pro ... -
在MyEclipse8.5中恢复jpetstore项目
2010-10-22 17:24 2321恢复jpetstore项目的过程1.在myeclipse8.5 ... -
SpringMVC关键问题讲解
2010-10-21 21:31 22923接着上篇文章,大家可能关心的那两个问题 1.control ... -
SpringMVC入门实例及详细讲解
2010-10-21 20:48 215123Spring 框架提供了构建 Web 应用程序的 ...
相关推荐
本示例"spring-autowire-demo.zip"是基于Spring 5.3.6版本,通过多个示例展示了自动装配的不同方式:default、byName、byType和constructor,帮助我们更深入理解这个功能。 首先,让我们了解什么是自动装配。自动...
- Spring提供了自动装配功能,允许开发者通过注解自动配置Bean的依赖关系。 - 可以通过使用@Qualifier注解或泛型参数来自动装配特定类型的Bean。 - 使用FactoryBean可以动态创建Bean实例。 - 也可以声明性地定义...
3. **基于名称的自动装配(By Name Auto-Wiring)**:Spring会查找与目标bean的属性名相同的bean并注入。在XML配置中,可以使用`autowire="byName"`开启此功能。 4. **基于注解的自动装配(Annotation-Based Auto-...
storm-spring-autowire 使storm支持spring的注入功能 由于storm的生命周期如下 1.在提交了一个topology之后(是在nimbus所在的机器么?), 创建spout/bolt实例(spout/bolt在storm中统称为component)并进行序列化. 2.将...
在Spring的XML配置文件中,可以通过`<beans>`标签的`autowire`属性来全局设置自动装配策略,或者在单个`<bean>`标签中通过`autowire`属性指定某一个bean的自动装配方式。 4. 使用注解进行自动装配 Spring 2.5引入了...
《Spring自动装配详解——基于IDEA 2020的小实例》 在Java开发领域,Spring框架以其强大的功能和灵活性,成为了企业级应用开发的首选。其中,Spring的自动装配特性(Autowired)是其核心特性之一,极大地简化了依赖...
该项目已移至 。 Spring Cloud Kubernetes 与集成 特征 (无论代码在Kubernetes内还是外部运行,它都是透明的) Kubernetes的DiscoveryClient 该项目提供了的的。 这使您可以按名称查询... @Autowire private Discov
具有Spring Boot Starter-gRPC Java JWT 使用Auth模块扩展出色的。 使用类似于Spring Security模块中使用的简单注释的简单实现。 快速开始 (尝试示例项目:Kotlin中的。) 简单的开始仅由3个简单的步骤组成。 ...
在压缩包文件名称“spring_0700_IOC_Autowire”中,“IOC”代表“Inversion of Control”,即控制反转,它是Spring的核心概念之一,自动装配是IOC的一种实现方式。这个文件可能包含了关于Spring自动装配的教程材料,...
在Spring框架中,`autowire`是一种自动装配bean依赖的方式,它极大地简化了bean之间的依赖注入过程。本文将深入探讨`autowire`自动导入句柄及其在实际开发中的应用。 ### 1. `autowire`简介 `autowire`是Spring...
- 可以通过`autowire`属性来设置自动装配策略,如`byName`和`byType`。 6. **AOP(面向切面编程)**: - Spring提供了基于代理的AOP实现,允许开发者定义切面,进行横切关注点(如日志、事务管理)的处理。在...
在Spring框架中,自动装配(Auto-Wiring)是一种简化配置的方式,它允许Spring容器自动为Bean提供依赖。这种特性使得开发者无需显式地在XML配置文件中声明Bean之间的依赖关系,从而减少了配置工作量,提高了代码的可...
在文件"1606SpringDay02-3"中,可能包含了对这些概念的详细讲解和示例代码,通过学习这部分内容,我们可以更深入地理解Spring如何管理和装配bean,从而更好地设计和构建Spring应用。同时,合理使用`parent`、`...
<bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> ``` `startQuertz`bean会启动并管理Quartz调度器,`triggers`属性的...
- Spring提供了两种自动装配方式:byName和byType。byName根据属性名匹配Bean,byType根据属性类型匹配Bean。 - 使用`autowire`属性可以开启自动装配,例如: ```xml ...
本篇将详细探讨"3Spring使用annotation方式autowire"这一主题,包括注解驱动的自动装配(Autowiring)以及相关的源码分析。 ### 一、注解驱动的自动装配 自动装配是Spring框架的一个核心特性,它允许框架自动管理...
### Spring自动装配模式详解 #### 一、引言 在Spring框架中,自动装配是一种非常实用的功能,可以简化Bean的依赖注入过程。Spring提供了多种自动装配模式,每种模式都有其适用场景。本文将详细介绍Spring框架中的...
本篇将重点讲解Spring的@Autowired自动装配机制,包括XML配置版和注解版,并深入到源码层面进行解析。 @Autowired是Spring框架中的一个核心注解,用于实现自动装配bean的需求。当我们想要在类中注入某个依赖时,...
**自动装配(Autowired)是Spring框架中的一个重要特性,它允许我们自动将依赖注入到bean中,而无需显式地在配置文件中指定依赖关系。在本文中,我们将深入探讨Autowired的工作原理、使用方式以及它如何简化Java应用的...
byName 自动装配是指通过设置 property 标签的 autowire 属性为 byName,Spring 将自动寻找一个与该属性名称相同或 id 相同的 Bean,注入进来。例如: ```xml <property name="dataSource" autowire="by...