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 遍历包中所有类方法注解 https://www.cnblogs.com/silyvin/p/10130678.html
参考:
来源: http://www.bubuko.com/infodetail-3209231.html