3

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

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

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

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

这些说明是否重复?在哪些情况下是,在哪些情况下不是?

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

(4)一般情况下,我可以说所有在classpath上找到的@interface类都可以被Spring用作注解吗?换句话说,我怎么知道哪些注解可以在我的项目中使用?所有这些都可以在我的类路径中找到,或者我需要以某种方式注册它们?

(5)我尝试在没有aspectj.jar的情况下使用spring aop:刚刚创建了一个Aspect并为这个aspect添加了XML定义(没有任何注释)。结果它抛出“找不到类异常:org/aspectj/weaver/BCException”。所以看起来我不能在没有 aspectJ 库的情况下使用 Spring AOP?

4

1 回答 1

7

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

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

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


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

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


[...]输入的日期应转换为 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);
                }
            }
        });
    }
}

[...]我怎么知道哪些注解可以在我的项目中使用?[...]

前段时间我发现了这个很棒的注释支持表(我不是作者)。它会告诉您何时启用哪些注释。


所有这些都可以在我的类路径中找到

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


所以看起来我不能在没有 aspectJ 库的情况下使用 Spring AOP?

如果您只使用接口代理(即您只在实现至少一个接口的类上应用方面),您可以在没有 CGLIB 的情况下使用 Spring。否则,您需要 CGLIB 来动态创建子类。

于 2012-05-12T16:46:45.257 回答