結合自定義注解的 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM