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 )管理所有组成应用系统的 ...
随机推荐
- Hbase 学习(六) 配置文件调优
这部分的内容,网上多了去了,都大同小异的,仅作为备忘录,省得需要的时候又要到处查. 1.zookeeper.session.timeout 默认3分钟,zookeeper和hbase通信的超时时间,设 ...
- es 加磁盘扩容
elasticsearch多磁盘扩容 1.问题 由于早前elasticsearch集群数据存储路径只配置了一个,所以某天磁盘突然爆满,集群差点当机.需重新配置多路径存储路径,因为在生产环境,得保证 ...
- Telegraf+InfluxDB+Grafana快速搭建实时监控系统 监控postgresql
Telegraf+InfluxDB+Grafana快速搭建实时监控系统 监控postgresql
- jqgrid 查询
<!DOCTYPE html> <html lang="en" lang="en" xmlns="http://www.w3.org ...
- jQuery stop()浅析
作为前端开发人员,JS和JQuery是我们经常用到的开发语言和工具类库.我们都晓得,在jQuery中有一个很强大的方法——stop(),他是阻止在连续动画或事件中出现重复累积状况的方法.那么,stop ...
- Textrank权值提取文本标签提取:
Textrank权值提取文本标签提取: 我已经爬取到了指定博主的新浪微博,然后我想从微博中提取出可以代表该博主兴趣特征的100个关键词,然后由这100个关键词提取出10个标签,代表博主的兴趣.我们此处 ...
- Prolog学习:基本概念
上一篇对Prolog有了一个感性的认识,今天介绍下Prolog中一些基本概念,想要用Prolog解决一些实际问题之前必须要先了解它们.这些概念在<七周七语言>这本书中都有介绍,我简单提炼汇 ...
- C#基础---------------C#正则表达式2
C#正则表达式语法规则详解 正则表达式基础知识 一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式. 字母文本指的是普通文本如"a ...
- HTTP 请求头与请求体 - 某熊的全栈之路 - SegmentFault
本文从属于笔者的HTTP 理解与实践系列文章,对于HTTP的学习主要包含HTTP 基础.HTTP 请求头与请求体.HTTP 响应头与状态码.HTTP 缓存这四个部分,而对于HTTP相关的扩展与引申,我 ...
- 超酷 CSS3/HTML5 3D 飘带菜单实现教程
今天我们来介绍一款很有创意的CSS3/HTML5菜单,首先菜单是飘带形状的,看起来很优雅,这种菜单在个人博客中用的比较多,不仅干净利落,而且很具有个性化.另外,这款菜单在鼠标滑过菜单项时,将会出现3D ...