Custom annotations in conjunction with the dynamic injection spring dynamic registration bean Spring-IOC BeanFactory runtime

 

 

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:

Spring-IOC BeanFactory run-time dynamic registration bean

Guess you like

Origin www.cnblogs.com/silyvin/p/11570069.html