zoukankan      html  css  js  c++  java
  • 结合自定义注解的 spring 动态注入

    MyController自定义注解:

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface MyController {
        String muv() default "";
    }
    

    初始化注入的UserServcie:

    @Service(value = "userService")
    public class UserService {
    
        public String doService(String co) {
            return ("---我是spring注入的do service方法---");
        }
    }
    

    根据自定义注解批量动态注入的MyController1,2同:

    @MyController
    public class MyController1 {
        public String getRes() {
            return "(我是被动态注入的"+this.getClass().getName()+")";
        }
    }
    

    动态注入的UserController:

    public class UserController {
    
        private UserService userService;
    
    //    public UserService getUserService() {
    //        return userService;
    //    }
    
        /**
         * 这个是必须的
         * @param userService
         */
        public void setUserService(UserService userService) {
            this.userService = userService;
        }
    
        public String toAction(String content){
            System.out.println("我是动态注册的UserController的toAction方法,开始调用初始注入的userService.doService方法");
            String res = userService.doService(content);
            MyController1 myController1 = (MyController1)SpringContextUtil.getBean(MyController1.class);
            MyController2 myController2 = (MyController2)SpringContextUtil.getBean(MyController2.class);
            return res + content + myController1.getRes() + myController2.getRes();
        }
    
    }
    

    springboot主函数:

    @SpringBootApplication
    public class DemoSpringbootApplication {
    
    	public static void main(String[] args) {
    		ApplicationContext applicationContext = SpringApplication.run(DemoSpringbootApplication.class, args);
    		SpringContextUtil.setApplicationContext(applicationContext);
    
    		//将applicationContext转换为ConfigurableApplicationContext
    		ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) SpringContextUtil.getApplicationContext();
    
    		DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) configurableApplicationContext.getBeanFactory();
    
    		// 通过BeanDefinitionBuilder创建bean定义
    		BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(UserController.class);
    
    		// 设置属性userService,【必须有setter】,此属性引用已经定义的bean:userService,这里userService已经被spring容器管理了.
    		beanDefinitionBuilder.addPropertyReference("userService", "userService");
    
    		// 注册bean
    		defaultListableBeanFactory.registerBeanDefinition("userController", beanDefinitionBuilder.getRawBeanDefinition());
    
    		System.out.println("开始根据自定义注解MyController动态注入");
    		Set<Class<?>> set = ClassUtil.getClassesController();
    		System.out.println("共 " + set.size() + "个类符合自定义注解");
    		for(Class<?> cl : set) {
    			BeanDefinitionBuilder beanDefinitionBuilderAno = BeanDefinitionBuilder.genericBeanDefinition(cl);
    			defaultListableBeanFactory.registerBeanDefinition(cl.getName(), beanDefinitionBuilderAno.getRawBeanDefinition());
    			System.out.println("注入成功 " + cl.getName());
    		}
    
    		UserController userController = (UserController) SpringContextUtil.getBean("userController");
    		String res = userController.toAction("入参");
    		System.out.println(res);
    	}
    
    }
    

    遍历包,扫描自定义注解的类,参考:

    Java遍历包中所有类方法注解

    参考:

    Spring-IOC BeanFactory运行时动态注册bean

  • 相关阅读:
    poj-1001 求高精度幂
    ECS训练营Day1—基于阿里云ECS、VuePress搭建静态网站
    阿里云免费领马克杯答案
    白盒测试之逻辑覆盖 简单易懂~
    如何合并多个PPT?
    failed to connect to gitee.com/github/gitlab port 443: timed out之类的错误
    解决 These dependencies were not found: * core-js/modules/es6.array.fill in xxx 之类的问题
    vue内嵌iframe跨域通信
    Luffy之课程详情页
    Flask之SQLAlchemy,flask_session以及蓝图
  • 原文地址:https://www.cnblogs.com/silyvin/p/11570069.html
Copyright © 2011-2022 走看看