Spring 动态注册bean。手动代码注册一个controller

ldt19870811 2017-01-05 04:45:53
如题。
描述下逻辑:已经启动完成spring,并且得到application上下文。
1、通过application上下文后续手动注册自定义bean
`启动并获得application
ApplicationContext app= new ClassPathXmlApplicationContext("...........xml");
MsgMap map = new MsgMap();
map.put("no1",1);
addBean("com.test.bean.TestBean1", "test1",map, app);

·这里贴上手动注册代码
method addBean(...)

/**
*
* @param className 注册class 全称
* @param serviceName 注册别名
* @param propertyMap 注入属性
* @param app application上下文
*/
private static void addBean(String className,String serviceName,MsgMap propertyMap, ApplicationContext app){
try {
Class<?> clazz = Thread.currentThread().getContextClassLoader().loadClass(className);
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz);
if(propertyMap!=null){
Iterator<?> entries = propertyMap.entrySet().iterator();
Map.Entry<?, ?> entry;
while (entries.hasNext()) {
entry = (Map.Entry<?, ?>) entries.next();
String key = (String) entry.getKey();
Object val = entry.getValue();
beanDefinitionBuilder.addPropertyValue(key, val);
}
}
registerBean(serviceName, beanDefinitionBuilder.getRawBeanDefinition(), app);
} catch (ClassNotFoundException e) {
System.out.println(className+",主动注册失败.");
}
}

method registerBean(....)

/**
* @desc 向spring容器注册bean
* @param beanName
* @param beanDefinition
*/
private static void registerBean(String beanName, BeanDefinition beanDefinition,ApplicationContext context) {
ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) context;
BeanDefinitionRegistry beanDefinitonRegistry = (BeanDefinitionRegistry) configurableApplicationContext
.getBeanFactory();
beanDefinitonRegistry.registerBeanDefinition(beanName, beanDefinition);
}

到此我的问题就出现了。如果我手动注册的是一个普通的java类,可以正常使用该bean例如:

public class TestServices {

public String test(String in){
return "input String is:"+in;
}

}

如果我把要手动注册的bean改为一下内容:

@Controller
public class TestServices {
@RequestMapping("/t")
public String test(String in){
return "input String is:"+in;
}

}

问题: 如何才能在手动注册bean的时候,让spring去扫描类结构,并自动注册controller。
这里我描述的可能有点矛盾,复述一下。
1、必须使用手动代码加载,请要贴什么配置文件的大神绕道。
2、我需要手动(使用代码)注册一个自定义的controller类(理想状态是让spring自己扫描注解添加依赖的对象bean,有其他的解决方案也行)。
3、个人觉得问题可能出在method registerBean() 这个方法上。有没有大神指导一下。
4、能贴出代码来最好了
...全文
2649 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
makeret 2018-01-03
  • 打赏
  • 举报
回复
你好,你的这个问题解决了没,我现在也要用这种方式
eagle53 2017-07-02
  • 打赏
  • 举报
回复
找到解决方案了吗
ldt19870811 2017-01-09
  • 打赏
  • 举报
回复
引用 3 楼 sinat_37284920 的回复:
你的意思是想在程序执行的过程中动态的对工程添加controller?
是的。我也只能找到xml解析注册的源码。弄不出来个所以然。 ----- 现在也还没有解决这个问题
sinat_37284920 2017-01-08
  • 打赏
  • 举报
回复
你的意思是想在程序执行的过程中动态的对工程添加controller?
JE_GE 2017-01-08
  • 打赏
  • 举报
回复
你现在的代码是可以注册@Controller的bean,已测试
解开者 2017-01-07
  • 打赏
  • 举报
回复
Controller不同于一般bean,其中除了和ioc有关的部分,还有和mvc有关的部分 上述代码放进容器的只是一个普通对象,而没有在mvc中做Uri映射等动作

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧