8 -- 深入使用Spring -- 2...6 Spring 4.0 增强的自动装配和精确装配
8.2.6 Spring 4.0 增强的自动装配和精确装配
Spring提供了@Autowired 注解来指定自动装配,@Autowired可以修饰setter方法、普通方法、实例变量和构造器等。当使用@Autowired标注setter方法时,默认采用byType自动装配策略。
package edu.pri.lime._8_2_6.bean; import java.util.Set; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; @Component
public class Chinese { private Axe axe;
private Dog dog; /*
* 指定setter方法进行自动装配,Spring将会自动搜索容器中类型为Axe的Bean实例,并将该Bean实例作为setter方法的参数传入。
* 如果找到多个类型为Axe的Bean,Spring会引发异常。如果没有找到Axe类型的Bean,Spring什么都不执行,也不会引发异常
*/
@Autowired
public void setAxe(Axe axe) {
this.axe = axe;
}
@Autowired
public void setDog(Dog dog) {
this.dog = dog;
}
/*
* 当使用@Autowried修饰带多个参赛的普通方法是,Spring会自动到容器中需找配型匹配的Bean,
*/
@Autowired
public void prepare(Axe axe,Dog dog){
this.axe = axe;
this.dog = dog;
}
/*
* 当使用@Autowired修饰一个实例变量时,Spring将会把容器中与该实例类型匹配的Bean设置为该实例变量的值。
* 如果容器中包含多于一个的Axe实例,则Spring容器会抛出BeanCreateException异常。
*/
@Autowired
public Chinese(Axe axe , Dog dog){
this.axe = axe;
this.dog = dog;
}
/*
* @Autowired 可以用于修饰数组类型的成员变量。
* Spring 会自动搜索容器中所有Axe实例,并以这些Axe实例作为数组元素来创建数组,最后将该数组赋给数组类型的成员变量。
*/
@Autowired
private Axe[] axes; /*
* @Autowired 标注集合类型的实例变量,或标注形参类型的集合方法。
* 对于集合类型的参数而言,必须使用泛型。
*/
@Autowired
public void setAxes(Set<Axe> axeSet){
}
public Axe getAxe() {
return axe;
}
public Dog getDog() {
return dog;
}
public Axe[] getAxes() {
return axes;
}
public void setAxes(Axe[] axes) {
this.axes = axes;
} }
Spring 4.0 增强后的@Autorwired注解还可以根据泛型进行自动装配。
Class : BaseDaoImpl<T>
package edu.pri.lime._8_2_6.bean.impl;
import edu.pri.lime._8_2_6.bean.BaseDao;
public class BaseDaoImpl<T> implements BaseDao<T> {
/*定义所有Dao组件都应该实现的通用方法,其他Dao组件只要继承该类并指定同泛型参数即可*/
public void save(T e) {
System.out.println("程序保存对象 " + e);
}
}
Class : UserDaoImpl
package edu.pri.lime._8_2_6.bean.impl; import org.springframework.stereotype.Component; import edu.pri.lime._8_2_6.bean.User;
import edu.pri.lime._8_2_6.bean.UserDao; @Component("userDao")
public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao{ }
Class : ItemDaoImpl
package edu.pri.lime._8_2_6.bean.impl; import org.springframework.stereotype.Component; import edu.pri.lime._8_2_6.bean.Item;
import edu.pri.lime._8_2_6.bean.ItemDao; @Component("itemDao")
public class ItemDaoImpl extends BaseDaoImpl<Item> implements ItemDao { }
Class : BaseServiceImpl<T>
package edu.pri.lime._8_2_6.bean.impl; import org.springframework.beans.factory.annotation.Autowired; import edu.pri.lime._8_2_6.bean.BaseDao;
import edu.pri.lime._8_2_6.bean.BaseService; public class BaseServiceImpl<T> implements BaseService<T> { @Autowired
private BaseDao<T> dao; public void addEntity(T entity){
System.out.println("调用 " + dao + " 保存实体 " + entity);
dao.save(entity);
}
}
Class : UserServiceImpl
package edu.pri.lime._8_2_6.bean.impl; import org.springframework.stereotype.Component; import edu.pri.lime._8_2_6.bean.User;
import edu.pri.lime._8_2_6.bean.UserService; @Component("userService")
public class UserServiceImpl extends BaseServiceImpl<User> implements UserService { }
Class : ItemServiceImpl
package edu.pri.lime._8_2_6.bean.impl; import org.springframework.stereotype.Component; import edu.pri.lime._8_2_6.bean.Item;
import edu.pri.lime._8_2_6.bean.ItemService; @Component("itemService")
public class ItemServiceImpl extends BaseServiceImpl<Item> implements ItemService { }
Class : BeanTest
package edu.pri.lime._8_2_6.bean.main; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import edu.pri.lime._8_2_6.bean.Item;
import edu.pri.lime._8_2_6.bean.User;
import edu.pri.lime._8_2_6.bean.impl.ItemServiceImpl;
import edu.pri.lime._8_2_6.bean.impl.UserServiceImpl; public class BeanTest { public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("app_8_2_6.xml");
UserServiceImpl us = ctx.getBean("userService",UserServiceImpl.class);
us.addEntity(new User()); ItemServiceImpl is = ctx.getBean("itemService",ItemServiceImpl.class);
is.addEntity(new Item());
}
}
@Qualifier允许根据Bean的id来执行自动装配实例变量
@Autowired
@Qualifier("steelAxe")
public void setAxe(Axe axe) {
this.axe = axe;
}
@Qualifier允许根据Bean的id来执行自动装配方法的形参
@Autowired
public void setAxe(@Qualifier("steelAxe") Axe axe) {
this.axe = axe;
}
啦啦啦
啦啦啦
啦啦啦
啦啦啦
8 -- 深入使用Spring -- 2...6 Spring 4.0 增强的自动装配和精确装配的更多相关文章
- 【Spring】浅析Spring框架的搭建
c目录结构: // contents structure [-] Spring是什么 搭建Spring框架 简单Demo 1,建立User类 2,建立Test类 3,建立ApplicationCont ...
- Spring系列之Spring常用注解总结
传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点:1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件 ...
- Spring集成jedis支持Redis3.0集群
接着上一节,我们通过spring FactoryBean实现redis 3.0集群JedisCluster与spring集成. http://www.linuxidc.com/Linux/2016- ...
- spring笔记3 spring MVC的基础知识3
4,spring MVC的视图 Controller得到模型数据之后,通过视图解析器生成视图,渲染发送给用户,用户就看到了结果. 视图:view接口,来个源码查看:它由视图解析器实例化,是无状态的,所 ...
- Spring学习笔记—Spring之旅
1.Spring简介 Spring是一个开源框架,最早由Rod Johnson创建,并在<Expert One-on-One:J2EE Design and Development> ...
- 【Spring】初始化Spring IoC容器(非Web应用),并获取Bean
参考文章 Introduction to the Spring IoC container and beans BeanFactory 和ApplicationContext(Bean工厂和应用上下文 ...
- Spring基础——在 Spring Config 文件中基于 XML 的 Bean 的自动装配
一.Spring IOC 容器支持自动装配 Bean,所谓自动装配是指,不需要通过 <property> 或 <constructor-arg> 为 Bean 的属性注入值的过 ...
- 一句话概括下spring框架及spring cloud框架主要组件
作为java的屌丝,基本上跟上spring屌丝的步伐,也就跟上了主流技术.spring 顶级项目:Spring IO platform:用于系统部署,是可集成的,构建现代化应用的版本平台,具体来说当你 ...
- Spring学习2—Spring容器
一.Spring容器接口关系 容器是Spring框架的核心,Spring容器就是一个巨大的工厂.Spring容器使用Ioc(控制反转(Inversion of Control )管理所有组成应用系统的 ...
随机推荐
- 多选下拉框带搜索(aps.net)
自己写了一个带搜索功能的多选下拉框,为了要获取值,就没有封装插件,实现思路 1.一个文本框 做搜索 2.一个文本框显示选中文本,一个隐藏控件存值 3.一个div里面绑定CheckBoxList控件(这 ...
- border-radius背景色超出圆角问题解决
span{ display: block; background: #f4f4f4; color: #333; font-size: 14px; -webkit-border-radius: 20px ...
- 百度网盘 http://pandownload.com/index.html
https://github.com/high-speed-downloader/high-speed-downloader
- scrapy 报错 no module named win32api 的解决方案
解决方案: 原因是缺少win32,到 http://sourceforge.net/projects/pywin32/files/ 找到对应的版本进行下载,直接安装即可 =============== ...
- STM32的TAMPER-RTC管脚作为Tamper的使用[转]
问题一: 当 TAMPER引脚上的信号从 0变成1或者从 1变成 0(取决于备份控制寄存器BKP_CR的 TPAL位),会产生一个侵入检测事件.侵入检测事件将所有数据备份寄存器内容清除. 然而为了 ...
- Struts2、Spring、Hibernate 高效开发的最佳实践(转载)
Struts2.Spring.Hibernate 高效开发的最佳实践 Struts2.Spring.Hibernate(SSH)是最常用的 Java EE Web 组件层的开发技术搭配,网络中和许多 ...
- ADO.NET实体数据模型中关于数据库字段默认值的处理
无论是Visual Studio 2010或者2013内置的ADO.NET实体数据模型都有一个小问题:数据库中有些字段已设置了默认值,但ADO.NET实体数据模型工具并不会自动进行设置. 这时需要手工 ...
- 关于Unity中的模型描边与Shader切换(专题二)
模型描边 1: LOL里面的模型描边效果,点击防御塔会有描边的效果,被攻击的时候模型也要描边凸显一下2: 网上可以找到模型描边的Shader,可以直接下载使用,一组第三方的Shader, 帮我们解决了 ...
- 关于VS2008和VS2013中字体的选择
我这学期上ASP.NET的课,用C#语言,配合VS2008.自己课余在研究手机游戏的开发,用的是C++语言,配合VS2013.这两种开发环境我自己试过好多字体,后来感觉适合我自己的应该是以下这两种: ...
- Selenium常用操作汇总二——如何操作cookies(转)
Web 测试中我们经常会接触到Cookies,一个Cookies主要属性有”所在域.name.value.有效日期和路径",下面来讲一下怎么操作Cookies. import java.ut ...