欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

javassist生成类, spring配置生成类,javassistspring,运行时使用javassi

来源: javaer 分享于  点击 20129 次 点评:228

javassist生成类, spring配置生成类,javassistspring,运行时使用javassi


运行时使用javassist定义类,然后再spring中动态添加bean定义。需要实现spring的BeanDefinitionRegistryPostProcessor接口,在此接口中定义类,并注册spring的bean定义。

涉及pom文件如下:

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>hello-javassist</groupId>    <artifactId>hello-javassist</artifactId>    <version>1.0-SNAPSHOT</version>    <dependencies>        <dependency>            <groupId>org.javassist</groupId>            <artifactId>javassist</artifactId>            <version>3.15.0-GA</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-context</artifactId>            <version>3.2.3.RELEASE</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-beans</artifactId>            <version>3.2.3.RELEASE</version>        </dependency>    </dependencies></project>

DynamicServiceRegistryPostProcessor实现spring的BeanDefinitionRegistryPostProcessor接口

package cn.outofmemory.hello.javassist.config;import cn.outofmemory.hello.javassist.IService;import javassist.*;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 java.io.IOException;/** * Created by byrx.net on 2015/12/14. */public class DynamicServiceRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {    @Override    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {        ClassPool pool = new ClassPool(true);//ClassPool.getDefault();        // create the class        String className = "cn.outofmemory.hello.service.Hello1";        CtClass cc = pool.makeClass(className);        try {            cc.addInterface(pool.getCtClass("cn.outofmemory.hello.javassist.IService"));            cc.addMethod(CtNewMethod.make("public void doSomething(){System.out.println(\"do Something\");}", cc));            //Class<?> clazz = cc.getClass();            cc.writeFile("./target/classes");            BeanDefinitionBuilder definitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(className);            beanDefinitionRegistry.registerBeanDefinition("hello1", definitionBuilder.getBeanDefinition());        } catch (CannotCompileException e) {            throw new RuntimeException(e);        } catch (NotFoundException e) {            throw new RuntimeException(e);        } catch (IOException e) {            throw new RuntimeException(e);        }    }    @Override    public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {    }}

上面定义类实现的接口:

package cn.outofmemory.hello.javassist;/** * Created by byrx.net on 2015/12/14. */public interface IService {    void doSomething();}

这里定义接口是为了后面更方便的使用动态生成类。

下面是spring配置文件:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns:context="http://www.springframework.org/schema/context"       xsi:schemaLocation="        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">    <bean class="cn.outofmemory.hello.javassist.config.DynamicServiceRegistryPostProcessor"/></beans>

配置文件中只有一个bean,是我们上面定义动态生成类,并注册到spring容器中的类。

最后是main类:

package cn.outofmemory.hello.javassist;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;/** * Created by byrx.net on 2015/12/14. */public class SpringWithJavassistApp {    public static  void main(String[] args) throws ClassNotFoundException {        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/spring.xml");        Class clazz = Class.forName("cn.outofmemory.hello.service.Hello1");        IService service1 = (IService) applicationContext.getBean("hello1");        service1.doSomething();    }}
相关栏目:

用户点评