spring 泛型注入4的泛型依赖注入是什么原理

一、为了更加快捷的开发,为了更少的配置,特别是针对 Web 环境的开发,从 Spring 4.0 之后,Spring 引入了 泛型依赖注入。
二、泛型依赖注入:子类之间的依赖关系由其父类泛型以及父类之间的依赖关系来确定,父类的泛型必须为同一类型。
通俗一点来说:两个子类之间的依赖关系不需要在子类中去声明,而是在父类中进行了声明,而依赖的纽带就是 泛型类型,必须是相同的父类泛型类型才具有依赖关系。
三、UML 类图:
说明:在 BaseService 中通过 @Autowired 注解自动装配了 BaseDao 的实例。而在 UserService 中并没有注入 UserDao 的实例,但是通过父类的泛型类型,
在 UserService 中已经注入了 UserDao 的实例。Department 与之类似。
四、例子:
* @author solverpeng
* @create -9:18
public class BaseDao&T& {
public void say() {
System.out.println("com.nucsoft.spring.Dao.BaseDao.say");
BaseDao.java
* @author solverpeng
* @create -9:18
public class BaseService&T& {
@Autowired
public BaseDao baseD
public void service() {
System.out.println(baseDao);
baseDao.say();
BaseService.java
* @author solverpeng
* @create -9:18
@Repository
public class UserDao extends BaseDao&User&{}
UserDao.java
* @author solverpeng
* @create -9:18
public class UserService extends BaseService&User&{}
UserService.java
public void test03() {
UserService userService = ctx.getBean(UserService.class);
userService.service();
控制台输出:
com.nucsoft.spring.Dao.UserDao@162a657ecom.nucsoft.spring.Dao.BaseDao.say
阅读(...) 评论()spring的依赖注入到底有什么优势? - 知乎245被浏览<strong class="NumberBoard-itemValue" title="4分享邀请回答235 条评论分享收藏感谢收起7114 条评论分享收藏感谢收起泛型DAO spring 如何注入
[问题点数:10分]
泛型DAO spring 如何注入
[问题点数:10分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|> 博客详情
一、Spring简介 1.Spring简化Java开发 Spring Framework是一个应用框架,框架一般是半成品,我们在框架的基础上可以不用每个项目自己实现架构、基础设施和常用功能性组件,而是可以专注业务逻辑。因此学习Spring Framework在架构和模式方面的结构和原理,对我们在架构和模块级别的理解帮助极大。Spring Framework(参考1)的宗旨是简化Java开发,主要的手段如下: (1)在架构上解耦:通过DI(依赖注入)管理类型依赖,通过AOP分离关注点,减少重复代码。 (2)在设计上广泛采用DIP(依赖倒置)和ISP(接口隔离)等原则和Facade(外观)等模式:提供简化的调用接口并封装了众多出色的第三方组件。 (3)在语言层面上采用注解:通过配置文件和Annotation(参考.NET Attribute)简化应用配置。 2.Spring Framework的架构和模块: Spring Framework本身的架构是典型的松散分层,外层可以按需引用全部内层,内层不能引用外层。Spring的基础组件如下图所示:
从图中可以看出,开始的模块只有从core/beans/aop/context四个组件,后来添加了context-support【1.2】扩展模块、expression【3.0】扩展模块和beans-groovy【4.0】扩展模块。 Spring上述模块的基础上,内建和封装了众多的实用的通用组件,主要的组件如图所示:
从图中可以看出,spring-oxm、spring-jdbc和spring-web是众多模块依赖的核心,spring-oxm提供了Object和XML的映射支持。 二、基础知识 1.DIP:DIP(依赖倒置原则)是DI(依赖注入)的核心(参考2)。 (1)高层模块不应该依赖于低层模块。两者都应该依赖于抽象。 (2)抽象不应该依赖于细节。细节应该依赖于抽象。 说人话就是:将对具体类的引用转换成对其接口的引用,具体类只引用接口(引用==依赖,接口==接口或抽象类)。事实上我们调用具体类的时候在头脑里也是只关心其提供的API而非实现,DIP则通过在设计和重构阶段在技术手段上保证了解耦。 2.DI:DI(依赖注入)让我们不必手写工厂代码来管理接口和实现类的映射、对象的创建和生命周期的管理。 (1)接口注入:必须实现特定的接口才可以,侵入性太强,现在已经无人关心和使用。 (2)构造函数注入:依赖体现在构造函数的参数上。 (3)属性注入:依赖体现在属性上。 由于在实现时,可以将类型注册为自己的兼容类型,这样依赖注入就可以直接替代new实例化对象,这样理解和使用依赖注入工具还不如不使用或手写工厂了。依赖注入工具在实现时肯定会实现成一个支持不同配置和不同生命周期的对象工厂,但即使没有提供一套添加依赖倒置原则限制的API,也不意味着我们把它当成new的替代品。如同映射工具虽然在实现时可以任意映射,但不是用来取代赋值的,而是用来处理领域实体和视图模型等有实际对应关系的对象之间的映射。 (1)依赖配置:依赖配置是依赖注入实现的基础。依赖注入工具都至少支持代码配置和文件配置。Java中可以通过Annotation(.NET中通过Attribute)简化配置。 (2)对象工厂:根据配置返回一个或多个对象。这是核心功能。 (3)生命周期管理:一般提供至少4种级别的支持:作用域、单例、线程、HTTP请求范围。 大多数依赖注入工具在支持依赖倒置原则的基础上,在技术手段上实现了更多的功能,如类型的兼容转换、对依赖命名、在配置时直接传入对象等。 三、Spring依赖注入的要点 Bean在Spring中就是POJO(.NET的POCO)。 Spring依赖注入需要掌握的核心是3个类型BeanDefinition、BeanFactory和ApplicationContext。 1.BeanFactory BeanFactory是spring中依赖注入的核心接口,其设计主要采用了ISP(接口隔离原则),通过多层次的接口继承即保证了单个接口的内聚又保证了整个体系的简洁。这里我们要关注的核心是DefaultListableBeanFactory。
如图所示,查看XmlBeanFactory代码,可以看到XmlBeanFactory只是通过XmlBeanDefinitionReader载入了BeanDefinition配置,XmlBeanDefinitionReader负责将配置解析到BeanDefinition。DefaultListableBeanFactory是真正的实现类,其中定义了类型为Map&String, BeanDefinition&的beanDefinitionMap列表用于存储依赖配置。 2.BeanDefinition: BeanDefinition定义了配置元数据,无论使用java code、xml、Annotation还是Groovy脚本方式,不同的配置方式通过不同的BeanDefinitionReader解析为BeanDefinition。
3.ApplicationContext ApplicationContext的核心都是将对象工厂功能委托给BeanFactory的实现类DefaultListableBeanFactory。目前最常用的是基于注解的AnnotationConfigApplicationContext和AnnotationConfigWebApplicationContext。
四、Spring依赖注入快速上手 1.使用Java配置代替xml配置 Java配置的核心是@Configuration和@Bean。定义生命周期使用@Scope,需要引入其他配置文件时使用@Import。 (1)@Configuration:应用了@Configuration注解的POCO成为了配置类。相当于xml配置文件。 (2)@Bean:配置类中应用了@Bean注解的方法成为了配置项。相当于xml中的Bean节点。
& 如果是Web应用程序,应该使用AnnotationConfigWebApplicationContext,在JSP中可通过WebApplicationContextUtils获取ApplicationContext对象。
2.基于Annotation的自动装配 自动装配主要使用@ComponentScan、@Component和@Autowired。 (1)@ComponentScan:作用在配置类上,启用组件扫描。扫描并注册标注了@Component(@Controller/@Service/@Repository)的类型。@Configuration已经应用了@Component注解。 (2)@Autowired:按类型自动装配。@Autowired和使用@Inject(JSR-330)或@Resource(JSR-250)的效果是类似的。@Autowired和@Inject默认按类型注入,@Resource默认按名称注入。 小结: 你至少应该知道的: (1)BeanFactory和BeanDefinition (2)DefaultListableBeanFactory和ApplicationContext (3)AnnotationConfigApplicationContext和AnnotationConfigWebApplicationContext (4)@Configuraton和@Bean Spring的依赖注入在配置上是基于对象而不是类型,最先支持的是xml而不是注解,到现在也没有比较方便的代码配置机制。虽然现在已经从xml过渡到了注解方式,但基于对象的基础仍然是影响很多方面的缺点。 如果我有什么遗漏的地方,欢迎在评论中告诉我。
支付宝支付
微信扫码支付
打赏金额: ¥
已支付成功
打赏金额: ¥Spring的依赖注入(接口注入)
10:06 148人阅读 评论(0) 收藏 举报
这篇文章来谈谈《Spring Framework 开发参考手册》的3.3.3.1小节中的Lookup方法注入。
仔细看看文档,这种方法主要是用在Singleton的Object中使用非Singleton的Bean时,通过lookup-method的
那个方法来取得非Singleton的Bean。一般用的不多,在用这种定义之前最好想明白你的需求。
· 先建立一个包:javamxj.spring.basic.lookup ,然后把以下5个文件放在这个包下。
Hello.java.
package javamxj.spring.basic.
public interface Hello {
public Random getRandom();
public abstract Random createRandom();
Random.java
package javamxj.spring.basic.
public class Random {
private int i = (int) (100 * Math.random());
public void printRandom() {
System.out.println("输出随机整数:
HelloAbstract.java
package javamxj.spring.basic.
public abstract class HelloAbstract implements Hello {
public Random getRandom() {
public void setRandom(Random random) {
this.random =
public abstract Random createRandom();
&?xml version="1.0" encoding="GBK"?&
&!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"&
&bean id="ran" class="javamxj.spring.basic.lookup.Random" singleton="false"/&
&bean id="hello" class="javamxj.spring.basic.lookup.HelloAbstract"&
&lookup-method name="createRandom" bean="ran"/&
&property name="random"&
&ref local="ran"/&
&/property&
package javamxj.spring.basic.
import org.springframework.beans.factory.BeanF
import org.springframework.beans.factory.xml.XmlBeanF
import org.springframework.core.io.ClassPathR
import org.springframework.core.io.R
public class Main {
public static void main(String[] args) {
Resource res = new ClassPathResource( "javamxj/spring/basic/lookup/beans.xml");
BeanFactory ft = new XmlBeanFactory(res);
Hello h = (Hello) ft.getBean("hello");
Random r1 = h.getRandom();
Random r2 = h.getRandom();
System.out.println("没有采用Lookup方法注入:");
System.out.println("Random 的两个实例指向同一个引用:" + (r1 == r2));
r1.printRandom();
r2.printRandom();
Random r3 = h.createRandom();
Random r4 = h.createRandom();
System.out.println("/n采用Lookup方法注入:");
System.out.println("Random 的两个实例指向同一个引用:" + (r3 == r4));
r3.printRandom();
r4.printRandom();
简单说明一下:
· Hello是一个接口类,实现面向接口编程。
· Random类用来输出随机整数。
· HelloAbstract是一个抽象类,包含了一个属性:random,还包含一个抽象方法createRandom(),如果这个方法不是抽象的,spring会重写已有的实现。
· beans.xml中定义了两个bean,ran指向Rondom类,注意它不是singleton的;hello指向HelloAbstract类,其中的random属性指向ran,createRandom方法也指向ran。
· 在Main类中,Hello类分别利用getRandom()和createRandom()方法来调用Random类。
· 这次需要将 spring-framework主目录/lib/cglib 目录中的cglib-nodep-2.1_2.jar加入到项目的 Libraries中,使用其中的动态代理。
运行结果:
没有采用Lookup方法注入:
Random 的两个实例指向同一个引用:true
输出随机整数:
输出随机整数:
采用Lookup方法注入:
Random 的两个实例指向同一个引用:false
输出随机整数:
输出随机整数:
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/javamxj/archive//456600.aspx
我的理解:接口注入其实是,通过配置Spring的lookup-method,及返回值 ,可以返回接口中方法的返回值而不需要实现接口中的抽象方法
浏览 20688
浏览: 121210 次
来自: 上海
额 这个封装真心不怎么样啊
看到别人有用这个。下来试试看。
楼主有没有遇到过 kettle导出的资源库正常,但是在另一台机 ...
你也太坑爹了吧,这能打开ppt? 打开的是http://aja ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'

我要回帖

更多关于 spring的泛型依赖注入 的文章

 

随机推荐