你是否常编一些小工具,做一些小东西?
在你扩展维护的时候,是不是觉得实例传递越来越复杂?
你经常改变想法,但小东西不停重构开始耽误你越来越多的时间?
你想到了用spring,但又不想对于一个简单的小东西,引入一个相对小重的框架,让你的小程序加载时都需要卡一下?
哈,试一试用下simpleFactory,是否可以解决你的烦恼,只有一个类哦,copy一下,就可以帮助你实现依赖注入;
simpleFactory是我在做小实验时,为了解决上面的问题,自己写的编码小工具,至少自己用起来很哈皮
SF代码:
package com.honeysuckle.webx.context;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
/**
* 类SF.java的实现描述:SimpleBeanFactory no one simpler than this one
*
* @author yanghang 2010-9-16 下午04:43:05
*/
public class SF {
private final Map<Class<?>, Object> context = new HashMap<Class<?>, Object>();
/**
* 向容器中放入某个实例
* @param clazz 该实例的类型,可以是接口
* @param object 该实例
*/
public void put(Class<?> clazz, Object object) {
this.context.put(clazz, object);
}
/**
* 获取某个实例(单例) <br/>
* 如果容器中不存在,会尝试初使化: <br/>
* 1.调用构造函数,args为可能的构造函数的参数 <br/>
* 2.会对该实例的set方法进行注入 <br/>
* 3.最后会调用init()方法 <br/>
*/
public Object get(Class<?> clazz, Object... args) {
Object object = this.context.get(clazz);
if (object == null) {
try {
object = this.instanceClazz(clazz, args);
this.instanceSetMethod(object);
this.instanceInitMethod(object);
this.put(clazz, object);
} catch (Exception e) {
return null;
}
}
return object;
}
//获取某个实例的多例,每次都会重新产生该实例
public Object getMulti(Class<?> clazz, Object... args) {
Object object;
try {
object = this.instanceClazz(clazz, args);
this.instanceSetMethod(object);
this.instanceInitMethod(object);
} catch (Exception e) {
return null;
}
return object;
}
//初使化该类,调用构造方法
private Object instanceClazz(Class<?> clazz, Object[] args) throws Exception {
Object object = null;
Class<?>[] clazzes = new Class[args.length];
for (int i = 0; i < args.length; i++) {
clazzes[i] = args[i].getClass();
}
Constructor<?>[] cons = clazz.getConstructors();
for (Constructor<?> con : cons) {
if (con.getParameterTypes().length != args.length) continue;
object = con.newInstance(args);
}
return object;
}
// 根据set方法,进行注入
private void instanceSetMethod(Object object) {
Method[] methods = object.getClass().getDeclaredMethods();
for (Method method : methods) {
if (method.getName().indexOf("set") != 0) continue;
Class<?>[] clazzes = method.getParameterTypes();
if (clazzes.length != 1) continue;
Class<?> pclazz = clazzes[0];
try {
Object pObject = this.get(pclazz);
method.invoke(object, new Object[] { pObject });
} catch (Exception e) {
continue;
}
}
}
// 初使化该类,调用init方法
private void instanceInitMethod(Object object) {
try {
Method method = object.getClass().getMethod("init", new Class<?>[] {});
method.invoke(object, new Object[] {});
} catch (Exception e) {
return;
}
}
}
用法示例
有类Bean1
public class Bean1 {
private String hello;
public void init() {
this.hello = "hello kitty";
}
public void show() {
System.out.println(this.hello);
}
}
执行 TestSF
public class TestSF {
private Bean1 bean;
public void setBean(Bean1 bean) {
this.bean = bean;
}
public void test() {
this.bean.show();
}
public static void main(String[] args) {
SF sf = new SF();
TestSF test = (TestSF) sf.get(TestSF.class);
test.test();
}
}
输出:
hello kitty
分享到:
相关推荐
这个“spring的一个简单的例子”压缩包可能是为了帮助初学者理解和入门Spring框架。以下是对这个简单例子中可能包含的知识点的详细解释: 1. **Spring 概述**: Spring 是一个开源的Java平台,它提供了一个全面的...
在这个"一个简单的spring的应用"项目中,我们将探讨如何搭建一个基础的Spring环境并进行单元测试。 首先,我们需要理解Spring的核心概念——依赖注入(Dependency Injection,简称DI)。DI允许我们解耦组件间的依赖...
在最简单的情况下,我们可以在一个类上使用 @Component 注解来告诉Spring容器,这个类是一个需要管理的bean。例如: ```java @Component public class MyComponent { // ... } ``` 2. **@Autowired** 注解:用于...
这个“一个简单的模仿spring的ioc实现”项目旨在帮助开发者理解Spring Ioc的核心概念,并通过自己的代码实现来加深对这一机制的理解。 首先,Spring Ioc的主要目标是解耦应用程序组件。它通过管理对象的生命周期和...
这个“一个简单的Spring应用例子”应该包含了一个基本的Spring配置和应用的构建结构,适合初学者理解和学习。 首先,我们来看一下这个压缩包中的文件: 1. `.classpath`:这是Eclipse IDE的一个项目配置文件,记录...
当Spring容器创建一个Bean时,会通过反射调用无参构造函数实例化对象,然后根据配置信息调用setter方法或使用构造函数参数进行依赖注入。 通过这个简单的例子,我们可以看到Spring如何通过反射机制实现依赖注入,...
Spring JDBC Template是Spring提供的一个简化数据库操作的工具,它封装了JDBC的繁琐部分,让开发者可以更专注于业务逻辑。 在这个“简易登录系统”中,Struts2主要承担用户界面和控制器之间的交互。用户在登录页面...
在src/main/java目录下,创建一个名为`com.yourpackage.controller`的包,并编写一个简单的Controller类,如`HelloController.java`: ```java package com.yourpackage.controller; import org.springframework....
在Spring中,典型的获取ApplicationContext对象的方式是使用ApplicationContext接口的一个实现类,如ClassPathXmlApplicationContext。这是一个根据给定XML文件的类路径的上下文实现。通常我们会在初始化Spring IoC...
通过上述分析,我们可以看到SpringJdbcTemplate是一个强大且灵活的工具,它通过封装JDBC操作,使得数据库访问变得更加简单和安全。在实际开发中,合理利用其特性,可以有效提升开发效率和代码质量。
在这个"第一个spring例子"中,我们将探讨如何创建一个简单的Spring应用,它包含了client和server两部分,这通常意味着我们将构建一个客户端-服务器架构的应用。为了运行此示例,你需要安装MySQL数据库服务和Apache ...
2. Bean定义:表示一个对象的配置信息,包括其类、属性、依赖等。 3. Bean工厂:根据Bean定义创建和管理Bean实例。 4. 注解解析器:解析类和方法上的注解,生成对应的Bean定义或切面规则。 5. AOP代理:用于拦截方法...
在"spring第一个例子"中,我们将创建一个简单的Spring应用程序。这个例子通常包括以下步骤: 1. **配置Spring**:首先,我们需要创建一个Spring的配置文件,例如`applicationContext.xml`。在这个文件中,我们会...
现在,我们来看如何创建一个简单的Spring AOP例子: 1. **定义切面(Aspect)**:切面是包含通知(Advice)和切入点(Pointcut)的类。通知定义了要执行的逻辑,切入点定义了何时执行。例如,我们可以创建一个名为`...
在"一个spring例子"中,可能包含了一个简单的Spring MVC应用,这是Spring框架提供的Web层解决方案。Spring MVC提供了一种模型-视图-控制器(Model-View-Controller)架构,用于处理HTTP请求、路由到相应的处理器方法...
例如,我们可以使用`<bean>`标签在XML中定义一个bean,或者在Java类上使用`@Component`、`@Service`、`@Repository`和`@Controller`等注解来标记为Spring管理的组件。 在描述中提到的博客链接没有具体内容,但通常...
例如,我们可以创建一个简单的`HelloWorld`类,然后使用`@Component`注解将其标记为一个Spring Bean。 ```java @Component public class HelloWorld { public String sayHello() { return "Hello, Spring!"; } }...
标题中的“郁闷了,一个最简单的Spring小程序都没搞定”表明博主在尝试开发一个基于Spring框架的小程序时遇到了问题。这通常涉及到Spring的核心概念,如依赖注入(Dependency Injection, DI)、ApplicationContext、...
在"struts+spring"的集成项目中,通常会有一个Spring配置文件(如:applicationContext.xml),用于定义bean,包括Action类、Service类和DAO类。这些bean可以通过Struts的ActionContext获取到,以便在Action中使用。...
当 Controller 类与启动类位于同一个包或者其子包下时,Spring Boot 默认会扫描该包及其所有子包中的组件(如 @RestController 注解的类)。这种方式适用于小型项目,因为组件组织简单,易于管理。 2. **启动类和 ...