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 )管理所有组成应用系统的 ...
随机推荐
- CSS(三):引入样式和优先级
CSS的引入样式总共有三种:行内样式(内联样式表).内部样式表.外部样式表.下面分别来介绍这三种样式. 一.行内样式 行内样式也叫内联样式,使用style属性引入CSS样式.看下面的示例: <! ...
- IDEA 修改文件编码
Intellij Idea 修改 properties 文件编码 现象:idea 默认的properties文件是GBK,当有中文时,不同的客户端配置的编码不同时,可能产生中文乱码. 解决:修改pro ...
- java对mongoDB的基本操作 ,游标使用
package com.mongodb.text; import java.net.UnknownHostException; import java.util.List; import org.bs ...
- struts2+hibernate(分页实现)
//Dao类中实现了list集合和pagetotal方法 package zjf.strhib.Dao; import java.util.ArrayList; import java.util.Li ...
- 想做web开发 就学JavaScript
有一天我被问到,为了快速地在 web 开发工作上增加优势,应该学习什么语言.我的思绪回到了大学,那时候我用 Pascal.Fortran.C和汇编语言,不过那个时候有不同的目标. 鉴于当前的状况和趋势 ...
- Linux共享库 Linux内核链表
#ifndef __LINKEDLIST_H_ #define __LINKEDLIST_H_ #include <stdlib.h> #define offsetof(type, mem ...
- ssh 中 远程文件传输
scp 命令是 SSH 中最方便有用的命令了,试想,在两台服务器之间直接传送文件,仅仅用 scp 一个命令就完全解决了. 你可以在一台服务器上 以 root 身份运行 #scp servername: ...
- MY_使用selenium自动登录126/163邮箱并发送邮件
转自:https://www.cnblogs.com/yin-tao/p/7244082.html 我使用的是python2.7.13+selenium ps:几天之前,我曾多次尝试写这段代码,但是在 ...
- mysql insert exists || mysql 判断数据是否存在
情景如下: "今日前端忽然说句, 我需要做个判断, 不能重复收藏, 我犹如颈有寒冰不寒而栗, 于是思考我该怎么做?为什么她都思考到了我没有思考到这是我的工作啊" 思考后得到三种解决 ...
- vue input 赋值无效
1.js代码如下 var vm = new Vue({ el:'#rrapp', data:{ q:{ name: null }, dict: {} }, }); 2.文本框代码如下 <inpu ...