永发信息网

如何给rose添加get set方法

答案:2  悬赏:80  手机版
解决时间 2021-03-05 03:16
  • 提问者网友:原来太熟悉了会陌生
  • 2021-03-04 06:08
如何给rose添加get set方法
最佳答案
  • 五星知识达人网友:大漠
  • 2021-03-04 07:06
rose封装了spring框架,集合spring IOC和AOP所构建的一个MVC框架
rose载体为RoseFilter
在web.xml配置文件,如filter进行配置即可,如下:
< filter>
< filter-name> roseFilter
< filter-class> net.paoding.rose.RoseFilter


< filter-mapping>
< filter-name> roseFilter
< url-pattern> /*
< dispatcher> REQUEST
< dispatcher> FORWARD
< dispatcher> INCLUDE

RoseFilter
初始化函数:initFilterBean

初始化 rose的 context 容器
WebApplicationContext rootContext = prepareRootApplicationContext();
rose通过继承XmlWebApplicationContext,构建自己的context RoseWebAppContext 作为最根级别的 ApplicationContext 对象
RoseWebAppContext rootContext = new RoseWebAppContext(getServletContext(), load , false);
rootContext.setConfigLocation(contextConfigLocation);
rootContext.setId( "rose.root");
rootContext.refresh();
上述的 refresh 方法和spring的 context 的初始化过程一样,即IOC对象的初始化
调用refresh 方法后,就会把配置文件中的 bean 载入到内存,成为 BeanDefinition
rose下 会有如下配置文件的约定 /WEB-INF/applicationContext*.xml
所有形如该形式的.xml文件将会被rose所识别,并载入到IOC容器中
// 识别 Rose 程序模块
this.modules = prepareModules(rootContext);

rose 以 controllers 作为一个模块,controllers 下的package也会作为一个模块
模块对象 ModuleResource 封装了 controllers 相关的资源
包括模块路径,匹配的xml资源等
初始化过程通过 provider.findModuleResources( load) 进行资源的加载,构建 List
初始化过程会把模块里的 beandefinition 类加载到内存,并保存在ModuleResource
module.addModuleClass(Class. forName(className));
完成模块资源扫描后,就开始为每个具体的模块进行具体的资源搭配构建了
List modules = modulesBuilder. build(moduleResources, rootContext)
构建一个模块list,包括了rose的各个模块,即对rose的各个模块的初始化
单独的模块 Module 会构建自己的 context 对象
ServletContext servletContext = parent.getServletContext();
Assert. notNull(servletContext);
ModuleAppContext wac = new ModuleAppContext();
wac.setParent(parent);
wac.setServletContext(servletContext);
wac.setContextResources( toResources(contextResources));
wac.setId(uniqueId);
wac.setNamespace(namespace);
wac.setMessageBaseNames(messageBasenames);
wac.refresh();
又看到 refresh 方法了,即初始化 Module 的context IOC容器
然后会把模块相关的bean 注册到模块的 IOC容器里
registerBeanDefinitions (moduleContext, moduleResource.getModuleClasses());
然后 rose 会把模块相关的 resolver interceptor等资源进行加载
// 从Spring应用环境中找出本web模块要使用的ParamValidator,ParamResolver, ControllerInterceptor, ControllerErrorHandler
List customerResolvers = findContextResolvers(moduleContext);
List interceptors = findContextInterceptors(moduleContext);
List validators = findContextValidators(moduleContext);
ControllerErrorHandler errorHandler = getContextErrorHandler(moduleContext);
找出关联的资源,然后会加载到module 中
module.addCustomerResolver(resolver);
module.addControllerInterceptor(interceptor);
module.addValidator(validator);
module.setErrorHandler(errorHandler);

对于interceptor 的加载如下
for ( int i = 0; i < interceptors .size(); i++) {
// 先判断是否有"名字"一样的拦截器
InterceptorDelegate temp = interceptors.get(i);
if (temp.getName().equals(interceptor.getName())) {
// rose内部要求interceptor要有一个唯一的标识
// 请这两个类的提供者商量改类名,不能同时取一样的类名
// 如果是通过@Component等设置名字的,则不要设置一样
ControllerInterceptor duplicated1 = InterceptorDelegate
. getMostInnerInterceptor(temp);
ControllerInterceptor duplicated2 = InterceptorDelegate
. getMostInnerInterceptor(interceptor);

throw new IllegalArgumentException(
"duplicated interceptor name for these two interceptors: '"
+ duplicated1.getClass() + "' and '" + duplicated2.getClass() + "'" );
}
// 加入到这个位置?
if (!added && interceptor.getPriority() > temp.getPriority()) {
this.interceptors .add(i, interceptor);
added = true;
}
}
拦截器的优先级即通过 if (!added && interceptor.getPriority() > temp.getPriority()) 这个语句进行判断
然后把拦截器加载到适当的位置

加载完相关的资源后,rose才对controller进行初始化,对模块里的各个 controller 进行初始化
for (String beanName : beanFactory.getBeanDefinitionNames()) {
checkController(moduleContext, beanName, module);
}

在初始化过程中,可以看到以下的语句:
Path reqMappingAnnotation = clazz.getAnnotation(Path.class);
if (reqMappingAnnotation != null) {
controllerPaths = reqMappingAnnotation.value();
}
我们在 controller 上标注的@Path 注解,在这里得到了解析,作为controller 的新路径
另外可以看到如下语句,rose 约定,controller 的命名规范
// TODO: 这个代码是为了使从0.9到1.0比较顺畅而做的判断,201007之后可以考虑删除掉
if (controllerName.equals("index" ) || controllerName.equals("home" )
|| controllerName.equals( "welcome")) {
// 这个异常的意思是让大家在IndexController/HomeController/WelcomeController上明确标注@Path("")
throw new IllegalArgumentException("please add @Path(\"\") to " + clazz.getName());
} else {
controllerPaths = new String[] { "/" + controllerName };
}
然后 rose 从context 里得到 controller 实例,没有对 controller 进行属性的标注,就是单例了
Object controller = context.getBean(beanName);
module. addController(//
controllerPaths, clazz, controllerName, controller);
添加 controller 实例到module 里
这样一个 module 就填充完成了
完成了资源的加载后就到了 另一个关键的步骤了,即rose的匹配树的构建过程
// 创建匹配树以及各个结点的上的执行逻辑(Engine)
this.mappingTree = prepareMappingTree(modules);
rose构建一个根节点,然后从根节点进行枝叶的添加
Mapping rootMapping = new ConstantMapping( "");
MappingNode mappingTree = new MappingNode(rootMapping);
LinkedEngine rootEngine = new LinkedEngine(null, new RootEngine(instructionExecutor ),
mappingTree);
mappingTree.getMiddleEngines().addEngine(ReqMethod. ALL, rootEngine);

TreeBuilder treeBuilder = new TreeBuilder();
treeBuilder.create(mappingTree, modules);
构建过程由 create 方法开始
整个构建过程为先从 module 开始,一个一个路径添加到匹配树上
for (Module module : modules) {
addModule(rootNode, module);
}
然后把controllers 的路径添加到匹配树上
for (ControllerRef controller : controllers) {
addController(module, parent, moduleEngine, controller);
}
最后把 action 方法的路径添加到匹配树上
for (MethodRef action : actions) {
addAction(module, controller, action, target, controllerEngine);
}
全部回答
  • 1楼网友:青灯有味
  • 2021-03-04 07:14
期待看到有用的回答!
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯