依赖注入是Spring中一个极其重要的概念。
本文通过JDK的注解和反射机制来完成在Spring中完成依赖注入的功能。
预备知识,注解,反射机制
完成一个注解我们通常需要三个步骤1,定义注解,2,使用注解,3,解析注解
下面我们通过实例来解释注解的使用
定义注解
package cn.tang.demos.spring;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD) //注解用在什么地方,method,field,class,type
@Retention(RetentionPolicy.RUNTIME)//注解用在什么级别,Source,class,runtime
public @interface Autoware {
String description() default "类似spring的自动装载";//注解元素的默认值
}
使用注解
package cn.tang.demos.spring;
public class Bean {
@Autoware(description="数据访问接口")
private MysqlDao dao;
public void testAdd(){
dao.add();
}
public MysqlDao getDao() {
return dao;
}
public void setDao(MysqlDao dao) {
this.dao = dao;
}
}
解析注解,下面代码包括了依赖注入的内容
package cn.tang.demos.spring;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class DITest {
/**
* 依赖注入的测试类,假设已经从xml配置文件中读取出来了两个Bean的类名
*/
private static final String daoClassStr = "cn.tang.demos.spring.MysqlDao";
private static final String beanClassStr = "cn.tang.demos.spring.Bean";
public static void main(String[] args) {
try {
test();// 为了能让代码更加直观,没有分别处理所有类型的异常,也没有多余的判断
} catch (Exception e) {
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
public static void test() throws Exception {
// 根据类名得到类类型
Class daoClass = Class.forName(daoClassStr);
// 根据类得到该类的构造方法
Constructor daoCon = daoClass.getDeclaredConstructors()[0];
// 调用构造方法得到类的一个实例
MysqlDao dao = (MysqlDao) daoCon.newInstance();
// 根据类名得到类类型
Class beanClass = Class.forName(beanClassStr);
// 根据类得到该类的构造方法
Constructor beanCon = beanClass.getDeclaredConstructors()[0];
// 调用构造方法得到类的一个实例
Object beanObject = beanCon.newInstance();
// 遍历所有的属性
for (Field f : beanClass.getDeclaredFields()) {
// 获取有注入类型的注解
Autoware an = (Autoware) f.getAnnotation(Autoware.class);
// 根据属性得到声明属性的类型 f.getGenericType()
if (an != null) {
// 输出注解的描述内容
System.out.println("annotation description : "
+ an.description());
// 得到与该属性的set方法,这也是为什么spring中的属性需要set方法
String setMethodName = "set"
+ f.getName().substring(0, 1).toUpperCase()
+ f.getName().substring(1);
//得到该方法
Method m = beanClass.getDeclaredMethod(setMethodName,
new Class[] { (Class) f.getGenericType() });
if (m != null) {
//反射机制调用该方法,注入DAO到bean中
m.invoke(beanObject, dao);
}
}
}
//现在我们得到了一个注入了dao的bean了,我们调用bean中的方法
((Bean) beanObject).testAdd();
}
}
分享到:
相关推荐
本篇将深入探讨如何通过注解方式来模拟Spring的这两种机制,帮助你理解其底层原理。 ### 1. 依赖注入(IoC) 依赖注入是Spring框架的核心特性之一,它通过反转对象创建和管理的控制权,使得应用程序组件之间的耦合...
【标题】:“自己动手模拟spring” 【描述】:在该主题中,我们将深入理解Spring框架的核心概念,并通过编码实践来模拟其工作原理。参考链接提供了一个CSDN博客文章,作者详细介绍了如何从零开始创建一个简易版的...
**模拟Spring功能** 在学习Spring之前,可能需要理解如何手动管理对象的依赖关系。Spring通过IOC(控制反转)和DI(依赖注入)实现了对对象生命周期的管理,从而消除了手动管理的复杂性。 **搭建Spring运行环境** ...
在提供的例子中,你可以看到如何创建一个Bean工厂,模拟Spring的Bean定义和实例化过程。例如,通过XML配置文件或注解来声明Bean及其依赖,并在需要时由容器负责注入。 接下来,我们转向AOP。AOP允许开发者定义“切...
- **创建业务逻辑类**:定义服务层和DAO层等业务逻辑组件,并使用Spring提供的注解进行依赖注入。 - **Spring基础语义** - **控制反转(IOC)**:也称为依赖注入(Dependency Injection),是一种设计模式,用于实现...
此外,Spring 3.2还加强了测试支持,包括MockMVC用于模拟Spring MVC请求,以及`@RunWith(SpringJUnit4ClassRunner.class)`注解配合`@ContextConfiguration`进行Spring应用上下文的加载,使单元测试和集成测试变得...
Spring的核心是依赖注入(Dependency Injection,DI),它允许对象之间的关系在运行时动态配置,而不是在编译时硬编码。这使得代码更易于测试和维护,因为依赖关系可以轻松地替换或模拟。此外,Spring还支持面向切面...
添加Spring功能通常包括配置Spring容器、定义Bean以及使用@Autowired或@Resource注解来进行依赖注入。此外,Spring的事务管理和国际化支持也是这一环节的重点。 ##### 11.5 Spring整合Hibernate Spring与Hibernate...
Spring是Java开发中最流行的框架之一,它以依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)为核心,极大地简化了企业级应用的开发。 首先,我们需要理解什么是依赖注入。...
在本文中,我们将深入探讨Spring的核心组件、依赖注入(DI)以及AOP(面向切面编程)的实现。 首先,让我们从Spring的核心组件开始。Spring由多个模块组成,包括核心容器(Core Container)、数据访问/集成(Data ...
Spring 2.0的主要设计原则之一是依赖注入,它允许组件之间松耦合。DI通过容器管理对象及其依赖关系,而不是由对象自行创建或查找依赖。这提高了代码的可测试性,并简化了系统维护。 2. **AOP(面向切面编程)** ...
1. **依赖注入(Dependency Injection,DI)**:这是Spring的核心功能,允许对象之间的关系在运行时动态配置,而不是在代码中硬编码。通过XML配置文件、注解或者Java配置类,可以实现对象的创建和依赖关系的管理。 ...
在Spring框架中,最重要的概念之一是依赖注入(Dependency Injection,DI)。这个版本的Spring已经完全支持DI,通过它,我们可以将对象之间的依赖关系解耦,使代码更易于测试和维护。DI可以通过XML配置文件、注解或...
在3.0.4版本中,测试框架已经相当完善,支持模拟对象和依赖注入。 通过阅读和分析Spring 3.0.4的源码,开发者可以深入了解Spring如何管理对象、执行AOP、处理Web请求以及与数据库交互,从而更好地利用Spring的功能...
Spring框架是Java开发中最常用的轻量级开源框架之一,它以依赖注入(Dependency Injection, DI)为核心,提供了AOP(面向切面编程)、事务管理、数据访问等多种功能,极大地简化了企业级应用的开发工作。本教程...
在2.5.6版本中,开发者可以使用Spring TestContext框架进行方便的依赖注入测试,同时支持Mockito等第三方库进行模拟对象测试。 7. **国际化和本地化**:Spring提供了对多语言环境的支持,可以在不同地区和语言环境...
3. **依赖注入**:Spring的DI机制允许开发者在不关心对象如何创建和管理的情况下,仅通过接口编程。这降低了代码间的耦合度,增强了可测试性。通过@Autowired注解,Spring可以自动匹配并注入依赖,同时提供了@...
5. **AOP支持**:虽然不是必须的,但为了模拟Spring的AOP功能,我们可以创建一个切面类和通知(advice),用于拦截和增强特定的Bean方法。这需要实现一个代理模式,如JDK动态代理或CGLIB代理。 6. **Scope管理**:...
1. **依赖注入(Dependency Injection,DI)**:Spring 2.0进一步完善了DI,使得组件之间的依赖关系可以通过配置文件或注解来管理,降低了代码的耦合度。DI允许开发者在不修改代码的情况下更换组件,增强了软件的可...
1. **核心容器**:Spring的核心组件包括Bean工厂和ApplicationContext,它们负责管理应用程序的bean和依赖注入。在4.1版本中,Spring引入了更多对Java配置的支持,使得开发者可以使用注解来配置bean,减少了XML配置...