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); } }
遍歷包,掃描自定義注解的類,參考:
參考: