`
hzs0502030128
  • 浏览: 23345 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类

spring 手动使用代码注入bean

阅读更多

直接上代码 很简单一看就懂了

 

 

这是我自写的一个与mybatis类似的orm框架与spring集成的两个主要的类,希望能给和同样想自造轮子的童鞋抛出一块砖头大笑

 

BeanFactory

 

package org.smile.orm.spring;

import org.smile.orm.dao.MapperProxy;
import org.springframework.beans.factory.FactoryBean;

public class MapperBeanFactory<T> implements FactoryBean<T>{

	private MapperProxy<T> proxy; 
	
	private Class<T> type;
	
	private boolean singleton;
	@Override
	public T getObject() throws Exception {
		if(singleton){
			return proxy.getInterfaceDao();
		}else{
			return MapperProxy.copy(proxy).getInterfaceDao();
		}
		
	}

	@Override
	public Class<T> getObjectType() {
		return type;
	}

	@Override
	public boolean isSingleton() {
		return singleton;
	}
	
	
	public void setSingleton(boolean singleton) {
		this.singleton = singleton;
	}

	public void setProxy(MapperProxy<T> proxy){
		this.proxy=proxy;
	}

	public void setType(Class<T> type) {
		this.type = type;
	}

}

 

SpringXmlApplication 

package org.smile.orm.spring;

import org.smile.orm.dao.DaoMapper;
import org.smile.orm.dao.MapperProxy;
import org.smile.orm.load.ClassPathXmlApplication;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;


public class SpringXmlApplication extends  ClassPathXmlApplication implements BeanDefinitionRegistryPostProcessor,ApplicationContextAware{
	
	private DefaultListableBeanFactory acf ;
	
	@Override
	public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefin)
			throws BeansException {
		initOrmApplication();
		BeanDefinitionBuilder bdb;  
		for(DaoMapper<?> mapper:application.getAllMapper()){
			bdb = BeanDefinitionBuilder.rootBeanDefinition(MapperBeanFactory.class.getName());  
            bdb.getBeanDefinition().setAttribute("id", mapper.getName());  
            bdb.addPropertyValue("proxy", new MapperProxy(application, mapper));
            bdb.addPropertyValue("type", mapper.getDaoClass());
            bdb.addPropertyValue("singleton", mapper.isSingle());
	        //  注册bean  
	        acf.registerBeanDefinition(mapper.getName(), bdb.getBeanDefinition());  
		}
	}

	@Override
	public void postProcessBeanFactory(ConfigurableListableBeanFactory factory)
			throws BeansException {
	}


	@Override
	public void setApplicationContext(ApplicationContext context) throws BeansException {
		this.acf=(DefaultListableBeanFactory)context.getAutowireCapableBeanFactory();
	}
	
}

 

 ClassPathXmlApplication

package org.smile.orm.load;

import java.util.List;

import javax.naming.NamingException;
import javax.sql.DataSource;

import org.smile.db.DbManager;
import org.smile.db.Dialect;
import org.smile.orm.OrmApplication;
import org.smile.orm.dao.BaseExecutor;
import org.smile.orm.dao.Executor;


public class ClassPathXmlApplication implements Application{
	
	protected DataSource dataSource;
	
	protected List<String> packageString;
	
	protected OrmApplication application;
	
	protected Dialect dialect;
	
	
	@Override
	public void setDataSource(Object dataSource) {
		if(dataSource instanceof DataSource){
			this.dataSource=(DataSource)dataSource;
		}else{
			try {
				this.dataSource = DbManager.getDataSource(String.valueOf(dataSource));
			} catch (NamingException e) {
				e.printStackTrace();
			}
		}
	}
	@Override
	public void setPackageString(List<String> packageString) {
		this.packageString = packageString;
	}
	@Override
	public void initOrmApplication(){
		application=new OrmApplication();
		application.setPackageString(packageString);
		Executor executor=new BaseExecutor();
		executor.setDataSource(dataSource);
		executor.setDialect(dialect);
		application.setExecuter(executor);
		application.init();
	}
	@Override
	public OrmApplication getOrmApplication() {
		return application;
	}
	@Override
	public void setDialect(String dialect) {
		this.dialect=Dialect.of(dialect);
	}
	
}

  

spring 中的配置

<bean id="dataSource" class="org.smile.db.DataSourceBean">
       <property name="name" value="mysql"></property>
	</bean>
	
	<bean id="ormappliction" class="org.smile.orm.spring.SpringXmlApplication">
		<property name="dataSource" ref="dataSource"></property>
		<property name="dialect" value="mysql"></property>
		<property name="packageString">
			<list>
				<value>dbmapper</value>
			</list>
		</property>
	</bean>

 

分享到:
评论

相关推荐

    Spring启动后获取所有拥有特定注解的Bean实例代码

    主要介绍了Spring启动后获取所有拥有特定注解的Bean实例代码,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下

    SpringSecurity.zip

    它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制...

    Spring in Action(第2版)中文版

    2.3注入bean属性 2.3.1注入简单的数值 2.3.2使用其他的bean 2.3.3装配集合 2.3.4装配空值 2.4自动装配 2.4.1四种自动装配类型 2.4.2混合使用自动和手动装配 2.4.3何时采用自动装配 2.5控制bean创建 2.5.1...

    Spring in Action(第二版 中文高清版).part2

    2.3 注入Bean属性 2.3.1 注入简单的数值 2.3.2 使用其他的Bean 2.3.3 装配集合 2.3.4 装配空值 2.4 自动装配 2.4.1 四种自动装配类型 2.4.2 混合使用自动和手动装配 2.4.3 何时采用自动装配 2.5 控制Bean...

    Spring in Action(第二版 中文高清版).part1

    2.3 注入Bean属性 2.3.1 注入简单的数值 2.3.2 使用其他的Bean 2.3.3 装配集合 2.3.4 装配空值 2.4 自动装配 2.4.1 四种自动装配类型 2.4.2 混合使用自动和手动装配 2.4.3 何时采用自动装配 2.5 控制Bean...

    Spring Boot 全局懒加载机制.docx

    但是现在 spring boot 应用中引入了很多第三方 starter ,比如 druid-spring-boot-starter 数据源注入、spring-boot- starter-data-redis 缓存等默认情况下, 引入即注入了相关 bean 我们无法去修改添加 @Lazy 。

    spring in action英文版

     2.4 使用Spring的特殊Bean  2.4.1 对Bean进行后处理  2.4.2 对Bean工厂进行后处理  2.4.3 分散配置  2.4.4 定制属性编辑器  2.4.5 解析文本信息  2.4.6 监听事件  2.4.7 发布事件  2.4.8...

    第24次课-1 Spring与Hibernate的整合

    将DataSource、SessionFactory、Transaction等作为Spring的Bean,通过配置文件的方式来管理。 24.1 概述 24.1.1 概述 Spring提供了DAO支持,可以简化DAO组件的开发,特别是IoC容器的使用,提供了DAO组件与业务...

    springmybatis

    mybatis实战教程mybatis in action之九mybatis 代码生成工具的使用 mybatis SqlSessionDaoSupport的使用附代码下载 转自:http://www.yihaomen.com/article/java/302.htm (读者注:其实这个应该叫做很基础的入门...

    SpringMybatisRedis整合

    项目说明 : ...优点 : MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。 Mybatis官方文档 : http://mybatis.github.io/mybatis-3/zh/index.html Mybatis-spring官方文档 : ...

    springboot参考指南

    Spring Beans和依赖注入 vi. 18. 使用@SpringBootApplication注解 vii. 19. 运行应用程序 i. 19.1. 从IDE中运行 ii. 19.2. 作为一个打包后的应用运行 iii. 19.3. 使用Maven插件运行 iv. 19.4. 使用Gradle插件运行 v...

    (一)spring 的依赖注入,您了解多少?

     依赖注入的模式,依赖注入模式一般分为两类:手动注入和自动注入。  手动模式即配置或者编程的方式,提前安排注入规则,包括xml资源配置元信息、java注解配置元信息和api配置信息,xml资源配置元信息,是比较常见...

    Activiti5用户指南(中文版)

    3.2 ProcessEngineConfiguration bean ............................................................................................................................... 9 3.3 数据库配置 .....................

Global site tag (gtag.js) - Google Analytics