<?xml version="1.0" encoding="UTF-8"?>
<mybeans >
<bean id="first" name="first" implement="com.my.ioc.testpackage.MybeanOneImpl"></bean>
</mybeans>
public class XmlToBean {
public Mybean getBean() throws Exception {
Mapping map = new Mapping();
URL u = this.getClass().getClassLoader().getResource("com/my/ioc/config/config-mapping.xml");
map.loadMapping(u);
Unmarshaller un = new Unmarshaller(Mybean.class);
File file = new File("myconfig.xml");
file.getAbsoluteFile();
Reader reader = new FileReader(file);
// Unmarshaller unmarshaller = new Unmarshaller(map);
un.setMapping(map);
Mybean read = (Mybean) un.unmarshal(reader);
return read;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapping PUBLIC "-//EXOLAB/Castor Mapping DTD Version 1.0//EN"
"http://castor.org/mapping.dtd">
<mapping>
<class name="com.my.ioc.config.Mybean" auto-complete="true">
<map-to xml="my_beans" />
<field name="mybeans" type="com.my.ioc.config.ConfigBean" collection="arraylist">
<bind-xml name="bean" node="element" />
</field>
</class>
<class name="com.my.ioc.config.ConfigBean" auto-complete="true">
<field name="id">
<bind-xml name="id" node="attribute"/>
</field>
<field name="name">
<bind-xml name="name" node="attribute"/>
</field>
<field name="implement">
<bind-xml name="implement" node="attribute"/>
</field>
</class>
</mapping>
public class ConfigBean implements Serializable{
private String id;
private String name;
private String implement;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getImplement() {
return implement;
}
public void setImplement(String implement) {
this.implement = implement;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Mybean {
private List<ConfigBean> mybeans;
public List<ConfigBean> getMybeans() {
return mybeans;
}
public void setMybeans(List<ConfigBean> mybeans) {
this.mybeans = mybeans;
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface MyClassAnnotation {
String isInvoke() default "NO";
}
@Retention(RetentionPolicy.RUNTIME)
public @interface MyMethodAnnotation {
String isTransaction() default "NO";
}
class MyTranstionHandler implements MyHandler,InvocationHandler{
private Object o;
private MyJotmTranstion tra;
public MyTranstionHandler(Object delegate) {
o = delegate;
// tra = new MyJotmTranstion();
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object a = null;
try {
if (method.isAnnotationPresent(MyMethodAnnotation.class)) {
MyMethodAnnotation an = method.getAnnotation(MyMethodAnnotation.class);
if (an.isTransaction().equals("yes") && an != null) {
// getTransactionManager().begin();
System.out.print("\n" + "start");
a = method.invoke(o, args);
// getTransactionManager().commit();
System.out.print("\n" + "end");
} else {
a = method.invoke(o, args);
}
}
return null;
} catch (Exception e) {
System.out.print("\n" + "invoke Exception");
}
return a;
}
private TransactionManager getTransactionManager()
{
return tra.getTransactionManager();
}
}
4 现在给出一个具体的实现类
java 代码
@MyClassAnnotation(isInvoke="yes")
public class MybeanOneImpl implements IMybeanOne {
@MyMethodAnnotation(isTransaction = "yes")
public void printString() {
System.out.print("\n"+" don some thing");
}
@MyMethodAnnotation(isTransaction = "yes")
public void printString1() {
System.out.print("\n"+" good work");
}
}
5 然后给出我的bean工厂了
java 代码
public class MyBeanFactory {
private static MyBeanFactory instance = null;
private MyBeanFactory() {
try {
initBean();
} catch (Exception e) {
int b = 0;
}
}
public static MyBeanFactory getInstance() {
return instance = new MyBeanFactory();
}
private Map<String, Class> beanMap = new HashMap<String, Class>();
private Object getConfigBean() throws Exception {
XmlToBean xml = new XmlToBean();
return xml.getBean();
}
private void initBean() throws Exception {
Mybean beans = (Mybean) getConfigBean();
List<ConfigBean> configList = beans.getMybeans();
for (int i = 0; i < configList.size(); i++) {
ConfigBean bean = configList.get(i);
registerBean(bean.getName(), bean.getImplement());
}
int i = 0;
}
private void registerBean(String beanName, String className) throws Exception {
Class bean = Class.forName(className);
beanMap.put(beanName, bean);
}
public Object getRegistedBean(String beanName) throws Exception {
Class o = beanMap.get(beanName);
if(o.isAnnotationPresent(MyClassAnnotation.class))
return o.newInstance();
MyClassAnnotation classAnn = (MyClassAnnotation) o.getAnnotation(MyClassAnnotation.class);
if (classAnn.isInvoke().equals("yes")) {
InvocationHandler handler = new MyTranstionHandler(o.newInstance());
return Proxy.newProxyInstance(o.getClassLoader(), o.getInterfaces(), handler);
} else {
return o.newInstance();
}
}
}
6 测试代码
java 代码
public static void main(String[] args) {
MyBeanFactory f = MyBeanFactory.getInstance();
try {
IMybeanOne o =(IMybeanOne) f.getRegistedBean("first");
o.printString();
} catch (Exception e) {
System.out.print("error "+e.getMessage());
}
}
String idValue = map.get("id");
if (idValue == null) {
throw ...;
}
int id = Integer.parseInt(idValue);
String name = map.get("name");
if (name == null) {
name = "";
}
String sexValue = map.get("sex");
if (sexValue == null) {
throw ...;
}
Gender sex = Gender.valueOf(sexValue);
...
String idValue = map.get("id");
if (idValue == null) {
throw ...;
}
int id = Integer.parseInt(idValue);
String name = map.get("name");
if (name == null) {
name = "";
}
String sexValue = map.get("sex");
if (sexValue == null) {
throw ...;
}
Gender sex = Gender.valueOf(sexValue);
...
public final class PropertyConverter<T> {
private final Class<T> targetType;
private PropertyConverter(Class<T> targetType) {...}
public static <T> PropertyConverter<T> to(Class<T> targetType) {
return new PropertyConverter<T>(targetType);
}
public T from(final Map<String, String> map) {
return Proxy.newProxyInstance(
new Class[]{targetType}, targetType.getClassLoader(), new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) {
String value = map.get(method.getName());
if (value == null) {
Object defaultValue = method.getDefaultValue();
if (defaultValue == null) {
throw ...;
}
return defaultValue;
}
return convert(value, method.getReturnType());
}
});
}
}
public final class PropertyConverter<T> {
private final Class<T> targetType;
private PropertyConverter(Class<T> targetType) {...}
public static <T> PropertyConverter<T> to(Class<T> targetType) {
return new PropertyConverter<T>(targetType);
}
public T from(final Map<String, String> map) {
return Proxy.newProxyInstance(
new Class[]{targetType}, targetType.getClassLoader(), new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) {
String value = map.get(method.getName());
if (value == null) {
Object defaultValue = method.getDefaultValue();
if (defaultValue == null) {
throw ...;
}
return defaultValue;
}
return convert(value, method.getReturnType());
}
});
}
}
convert()函数是调用apache的ConvertUtilsBean做的,没什么说的。
@interface Foo {
int id();
String name() default "";
Gender sex();
}
Map<String, String> map = ...;
Foo foo = PropertyConverter.to(Foo.class).from(map);
foo.id();
foo.name();
分享到:
相关推荐
《Spring IOC容器实现分析》 在Java开发领域,Spring框架无疑是使用最为广泛的轻量级框架之一,其中的核心组件就是IOC(Inversion of Control)容器。本文将深入剖析Spring的IOC容器,理解其工作原理和重要功能,以...
spring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demospring ioc模块手写demo...
在本项目中,我们将根据Spring的IoC原理,尝试实现自己的IoC框架。 首先,理解IoC的概念至关重要。IoC是指应用程序的控制权由传统的方式(如:对象直接创建和管理依赖关系)转移到框架或容器中,这样对象不再负责...
springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC手写框架分析springIOC...
9. **单元测试与调试**:为了确保容器功能的正确性,需要编写单元测试用例。同时,良好的日志记录和调试信息可以方便开发者理解和调试容器。 通过实现这样一个自定义的Spring IOC容器,我们可以更深入地理解Spring...
Spring IOC(Inversion of Control,控制反转)是Spring框架的核心组成部分,它负责管理应用程序中的对象。这个"手写Spring IOC注解实现版本"项目旨在帮助我们深入理解Spring框架的工作原理,通过实际动手实现来增强...
在【标签】中,“IOC DI 手写”进一步强调了实现的核心特性,即这些核心组件都是开发者自行编写的,没有依赖额外的框架。 从【压缩包子文件的文件名称列表】"ShouXieMVC"来看,这可能是作者实现的一个简易的Model-...
Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它负责管理对象的生命周期和依赖关系。在本主题中,我们将深入探讨如何手写一个基于XML的Spring IOC实现,模仿Spring框架中的`...
在标题"自己开发项目ioc"中,我们可以推断出你在构建一个自定义的项目,并且在这个项目中应用了IoC的概念。这可能意味着你正在创建一个框架或者服务,其中包含了一个IoC容器来管理对象的生命周期和依赖关系。这样的...
在本资源"手写spring ioc(三) 资源org.zip"中,我们主要关注的是如何实现一个简易版的Spring IOC(Inversion of Control)容器,它涵盖了ioc的基本功能,包括解决循环依赖、使用构造器注入以及自动注入等核心特性。...
在IoC中,不再由对象自己去创建或查找依赖的对象,而是将这种控制权交给一个专门的容器(即Spring Ioc容器)。这样,对象只需要声明自己需要哪些依赖,而具体的获取和管理过程则由容器负责,实现了对象间的低耦合。 ...
实验要求 1. 利用注解、反射和工厂模式设计一个简单的IoC容器 2. 该IoC容器包含3个...然后我们需要自己实现一个IoC容器类,处理自定义的注解的基本逻辑; 接下来在test类中实例化IoC容器,并从中取得bean,调用其方法
通过自己动手实现,初学者可以更好地理解Spring是如何在幕后管理对象和处理依赖的,这对于提升编程技能和设计模式的理解非常有益。同时,这也是软件开发中常用的一种学习方法——通过模仿和实践来深入理解复杂的概念...
自己写了三个分别关于WEB,IOC,ORM的框架现将全部开源,内有说明文档,测试示例项目,框架源代码文件,sql语句等
标题中的“雷赛IOC0640.rar”指的是雷赛智能公司的一款名为IOC0640...通过深入学习这些内容,无论是系统集成商、自动化工程师还是设备维护人员,都能提升自己在工业自动化领域的专业技能,更好地应对实际工作中的挑战。
总的来说,"图片转IOC图标工具"是一款高效且实用的开发辅助工具,它解决了在iOS应用开发中创建和管理图标时可能出现的繁琐工作,使得开发者可以更专注于代码编写和功能实现,从而提高整体开发效率。对于任何涉及iOS...
1. **依赖注入(Dependency Injection, DI)**:这是IOC的核心概念,DI允许我们通过构造函数、属性或方法将依赖注入到对象中,而不是让对象自己去创建或查找依赖。这样可以避免硬编码,使代码更加灵活。 2. **接口...
总的来说,学习"JavaEE Spring IoC入门"意味着你需要理解Spring如何通过IoC管理对象,掌握XML配置文件的编写,以及如何在Web环境中使用Spring MVC进行开发。此外,还需要了解如何编写测试用例来验证Spring配置的有效...
我们都知道,Spring框架的IOC是基于Java的反射机制实现,实现IOC,...IOC和DI是Spring里面最核心的东西,,资源中会写出这两个模块。资源内容包括Java反射机制的实践,使用反射机制实现IOC(包括依赖注入和对象创建)。
IOC(Inversion of Control,控制反转)模式是一种软件设计原则,它在面向对象编程中用于解耦组件之间的依赖关系。C#中实现IOC的一种常见方式是通过依赖注入(Dependency Injection,DI)。在这个“IOC模式 c#经典...