MyController custom annotation:
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface MyController { String muv() default ""; }
Initialization injected UserServcie:
@Service (value = "that userService") public class UserService { public String the doService (String CO.'S) { return ( "spring --- I --- injection do service method"); } }
According to custom annotation batch dynamic injection MyController1,2 with:
@MyController public class MyController1 { public String getRes () { return "(I dynamically injected" + this.getClass () getName () +. ")"; } }
Dynamic injected UserController:
the UserController {class public Private UserService that userService; // public UserService getUserService () { // return that userService; //} / ** * This is necessary * @param that userService * / public void setUserService (UserService that userService) { this.userService = that userService; } public String toAction (String Content) { System.out.println ( "I UserController toAction method is dynamic registration, start calling userService.doService initial injection method"); String userService.doService RES = (Content); MyController1 myController1 = (MyController1) SpringContextUtil.getBean ( MyController1.class); MyController2 myController2 = (MyController2) SpringContextUtil.getBean ( MyController2.class); return res + content + myController1.getRes() + myController2.getRes(); } }
springboot main function:
@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.genericBeanDefinition BeanDefinitionBuilder (UserController.class); // set properties userService, [must] have a setter, this attribute references that have been defined bean: userService, here userService spring container has been managed. BeanDefinitionBuilder.addPropertyReference ( "userService" , "userService"); // registration bean defaultListableBeanFactory.registerBeanDefinition ( "the UserController", beanDefinitionBuilder.getRawBeanDefinition ()); System.out.println ( "start dynamic injection according to custom annotation MyController"); the Set <Class <>>? ClassUtil.getClassesController = SET (); System.out.println ( "total" + set.size () + "classes meet custom annotation"); for (Cl class <?>: SET) { BeanDefinitionBuilder beanDefinitionBuilderAno = BeanDefinitionBuilder.genericBeanDefinition(cl); defaultListableBeanFactory.registerBeanDefinition (cl.getName (), beanDefinitionBuilderAno.getRawBeanDefinition ()); System.out.println ( "successful injection" + cl.getName ()); } UserController userController = (UserController) SpringContextUtil.getBean("userController"); String res = userController.toAction("入参"); System.out.println(res); } }
Traversing the package, a class scanning custom annotations, reference:
Java package traversal of all classes annotated method
reference: