关于Spring3框架的一系列问题框架、系列、问题

2023-09-03 14:35:38 作者:岛屿末歌

以下是阅读Spring参考时产生的问题,请帮助。

(1)我是否需要手动创建ApplicationContext?我是否需要AplicationContext的第二个实例?

一 Spring前世今生与Spring编程思想

(2)我们有以下配置说明:

<context:annotation-config/> 
<context:component-scan base-package=".."/> 
<mvc:annotation-driven/>

这些说明是否复制了它们自己的文件?在哪些情况下是,在哪些情况下不是?

(3)我对Spring介绍的从字符串转换为对象的所有方法都有些困惑:PropertyEditor、转换、格式化.. 下面是一个简单的用例: 我有一个处理POST请求的Spring MVC控制器。该请求是填写某些表格的结果。该表单是某个实体的Web表示。 因此,假设用户提交了一个新的项目表单。在该表格中有一个日期字段和一个经理姓名字段,可从现有经理列表中选择。应将输入的日期转换为项目对象的日期属性,以及使用此名称创建或定位的经理的姓名-经理属性(即,我要将经理注入到他的项目中)。在这种情况下,我应该使用什么?属性编辑器、格式化程序,还是其他?

(4)一般来说,我可以说在类路径上找到的所有@接口类都可以被Spring用作注释吗? 换句话说,我如何知道我的项目中可以使用哪些批注?可以在我的类路径中找到的所有内容,还是我需要以某种方式注册它们?

(5)我尝试在没有aspectj.jar的情况下使用Spring AOP:只是创建了一个方面并为该方面添加了XML定义(没有任何注释)。结果,它抛出"类未找到异常:org/AspectJ/weaver/BCException"。 看来我不能在没有AspectJ库的情况下使用Spring AOP?

推荐答案

(1)我是否需要手动创建ApplicationContext?我是否需要AplicationContext的第二个实例?

在两种环境中,Spring通常都是美元--在Web开发和桌面应用程序/独立服务器中。在前一种情况下,ApplicationContext是通过Servlet 3.0容器中web.xmlWebContextInitializer中定义的ContextLoaderListener自动创建的。

在后一种情况下(独立应用程序),您负责创建和销毁应用程序上下文。

(2)我们有以下配置说明:

<context:component-scan base-package=".."/>提供了<context:annotation-config/>plus的所有功能(惊喜!)组件扫描。<mvc:annotation-driven/>是完全独立的,它可以识别像@Controller这样的spring-mvc批注。

[...]输入的日期应转换为Project对象的Date属性[...]

@Controller内注册自定义编辑器:

@Controller
public class FooController {
    @InitBinder
    public void binder(WebDataBinder binder) {
        binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
            public void setAsText(String value) {
                try {
                    setValue(new SimpleDateFormat("yy-MM-dd HH:mm:ss").parse(value));
                } catch (ParseException e) {
                    setValue(null);
                }
            }
        });
    }
}

[...]我如何知道我的项目中可以使用哪些批注?[...]

我在一段时间前发现了这个awesome annotations support sheet(我不是作家)。它将告诉您启用了哪些批注。

我的类路径中可以找到的所有内容

@Inject如果在CLASSPATH上找到它,则需要手动启用其他批注,请参见上文。

所以看起来没有AspectJ库我就不能使用Spring AOP?

如果您只使用接口代理(即,您只对实现至少一个接口的类应用方面),则可以使用不带CGLIB的Spring。否则,您需要CGLIB动态创建子类。