参考一下文章
http://www.iteye.com/topic/1121913
http://teddywang.iteye.com/blog/741457
@Named("tablesConfigContext")
@Singleton
@Lazy
public class TablesConfigContext
autowired,自动封装
<context:component-scan>需要@注解配合么?否则那些是需要初始化的bean呢?
目标:减少xml配置,设置零配置,但是貌似结构不清晰了,真的好么?会不会影响效率呢?spring如何实现的呢?
从spring2.5开始,annotation结合BeanPostProcessor成了扩展Spring IoC容器的常用方法。Spring2.5增加了对JSR-250中@Resource, @PostConstruct, @PreDestroy的支持,Spring 3.0又增加了对JSR-330 (Dependency Injection for Java)中 @Inject,@Qualifier, @Named, @Provider的支持。将相关的jsr jar包丢到classpath,并注册相应的BeanPostProcessor,其它的一切spring会帮你完成。spring还提供了一个简便的方法,通过在context的XML配置文件中加入:
- <context:annotation-config/>
spring 会自动注册AutowiredAnnotationBeanPostProcessor, CommonAnnotationBeanPostProcessor, RequiredAnnotationBeanPostProcessor,代码中就可以使用@Autowired, @Required等annotaion了。
再回到文章开头的问题吧。spring从2.5开始加入了classpath scanning的功能,来代替之前在xml中定义Bean。首先在context的XML配置文件中加入:
- <context:component-scan base-package="org.example"/>
spring 便会在org.example以及它的子package中查找所有的类,将符合条件的Bean注册在IoC容器当中。到3.0,spring引入了4种原型annotation(stereotype annotaion),分别为@Component, @Serivce, @Controller, @Repository。一般情况下只在将类加上@Componet,spring在扫描classpath的时候会自动检测到,并将这个类注册到IoC 容器中,在代码的其它部分,便可以借助@Autowired来注入这个Bean。后面的三种原型分别是特殊的@Conponet,适用于更加特殊的场合,比如Service层,Spring MVC, DAO等。这一点从源码上也可以看出:
- @Target({ElementType.TYPE})
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- @Component
- public @interface Service {
- String value() default "";
- }
@Service本身就是被@Componet这个元注解(meta annotaion)标注的。因此对于这三个层的Bean, spring的文档也推荐将它们标注为@Service, @Controller与@Repository,因为这样更方便其它工具对这些特殊Bean的处理以及为它们加上相关AOP的 aspects,spring在后续版本的升级上也可能对它们增加更多的特殊语义。至于它们到底比普通的@Componet多了哪些 aspects,spring的文档上并没有详细说明,只简单地提到了对于@Repository,spring会自动加上exception translation,用于转化持久层抛出的异常。我google了一下,包括spring论坛的帖子,也没能找到这方面的详细信息,这点希望熟悉spring源代码的朋友能够说说。
现在通过classpath scanning以及@Component,@Autowired等annotation,我们已无须通过xml来定义Bean了。但还必须在application context的xml中添加<context:annotation-config/>与<context:component-scan base-package="org.example"/>。再进一步想,能不能把这个配置文件也去掉,实现真正的零配置?spring3.0原先Spring JavaConfig项目的功能移到了Spring Core里面,从而实现了利用Java代码来代替传统的XML配置文件,这个功能是通过@Configuration, @Bean, @Import, @DependsOn等annotation实现的。
- @Configuration
- public class AppConfig {
- @Bean
- public GreetingDao greetingDao() {
- return new GreetingDao();
- }
- }
- public class GreetingDao {
- public String getGreeting(){
- return "Hi";
- }
- }
@configuration表明这个类包含Bean的定义,@Bean在这里就相当于原先的配置:<bean id="greetingDao" class="septem.demo.GreetingDao"/>。通过AnnotationConfigApplicationContext就可以使用这个Bean了:
- @Test
- public void test_java_config(){
- AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
- GreetingDao dao = ctx.getBean(GreetingDao.class);
- assertEquals("Hi", dao.getGreeting());
- }
注意AppConfig里面的greetingDao虽然是是直接new出来的,但它的默认scope仍是singleton,跟采用配置文件的情况是一样的,如果需要prototype,则可以另外为它加上@Scope("prototype")。上面采用的方法是手工将Bean定义在 @Configuration里面,我们同样可以让spring自动检测Bean,比如下面的GreetingSerivce:
- @Service
- public class GreetingService {
- public String sayHello(){
- return "Hello";
- }
- }
将GreetingService标注为@Service,就不需要在AppConfig里面注册了:
- @Test
- public void test_service(){
- AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
- ctx.scan("septem.demo");
- ctx.refresh();
- GreetingService service = ctx.getBean(GreetingService.class);
- assertEquals("Hello", service.sayHello());
- }
以上的ctx.scan("septem.demo")就相当于配置文件:<context:component-scan base-package="septem.demo"/>。注意因为@Configuration本身也是被@Component这个meta-annotation标注的,所以AppConfig也不需要手工在 AnnotationConfigApplicationContext里注册,它同@Service一样会被自动检测到。Spring3.0还提供了 AnnotationConfigWebApplicationContext用来代替原先web项目中的 XmlWebApplicationContext,这样在web项目中同样可以实现真正的零配置了
相关推荐
标题 "spring+springmvc+mybatis+framemarker的增删……" 描述了一个使用Spring、SpringMVC、MyBatis和FreeMarker这四大核心技术构建的Web应用项目。这个项目虽然规模不大,但却包含了完整的CRUD(创建、读取、更新...
"001_如何学习JAVA300集(一定要看…………).mp4"这个视频课程,很可能是对以上知识点的详细讲解,建议按照课程结构系统学习,同时结合实践项目巩固知识,以更好地应对互联网行业的竞争和挑战。在学习过程中,不断...
虽然现代Java EE开发中,轻量级框架如Spring的使用越来越普遍,但EJB仍然是构建大型企业级应用的重要组件。EJB与Spring等框架可以协同工作,提供更全面的企业级解决方案。 总结: EJB应用开发是一个涵盖广泛主题的...
提供的两个文件,"spring3 MVC实战,手工搭建Spring3项目demo_敲敲代码跳跳舞……_百度空间.mht"和"Spring3中js-css-jpg-gif等静态资源无法找到(No mapping found for HTTP request with URI)问题解决_敲敲代码跳...
- 使用注解或XML配置方式完成实体类与数据库表之间的映射。 ##### 7. DAO层开发 - 开发数据访问对象(DAO),负责数据的增删改查操作。 - 利用Hibernate提供的Session和TransactionAPI进行数据库操作。 ##### 8. ...
Java 3DMenu 界面源码 5个目标文件 内容索引:Java源码,窗体界面,3DMenu Java 3DMenu 界面源码,有人说用到游戏中不错,其实平时我信编写Java应用程序时候也能用到吧,不一定非要局限于游戏吧,RES、SRC资源都有,都...
java8 源码 #spring-boot-dubbo脚手架 ##框架包含那些? mybatis-plus 增强版 mybatis,简化mapper,service等待代码编写任务 spring-boot 简化新Spring应用的初始搭建以及开发过程 spring-boot-starter-dubbo 基于...
SSM框架是Java Web开发中非常流行的组合框架,它由Spring、Spring MVC和MyBatis三个独立的部分组成。本篇将详细解析这三个组件的主要功能及其在项目中的具体应用。 #### 一、Spring框架简介 Spring框架是一个轻量...
面向AOP编程:通过自定义注解实现接口限流、操作日志记录等 …… 开发环境 工具:IntelliJ IDEA JDK 1.8 数据库:MySQL 8.0.15 项目构建:后端Maven、前端 Webpack 后端 Web框架:Spring Boot 安全框架:Spring ...
Java事务回滚失败问题分析 Java事务回滚失败问题分析是指在Java...Java事务回滚失败问题分析需要注意检查型异常和非检查型异常的区别,并采取相应的处理方法,使用@Transaction注解和自定义异常等方法来解决问题。
3. **Entity类与Hibernate注解**:在Hibernate 4.0.1中,使用注解来定义实体类和其与数据库表的映射关系。常见的注解包括@Entity、@Table、@Id、@GeneratedValue等,它们分别用于标记实体类、指定表名、定义主键和...
使用场景及目标:这份资源适用于Javaweb期末设计作业,也适合用于练习适用ssm项目和vue+elementui开发的模式,从而更好的入门Javaweb这门课程,为后续学习Java或者前端做好准备。 其他说明:资源中包括:Java代码,...
InterestingJavaEE 有趣的JavaEE,有趣?呵呵……我也很无奈…… 这个工程是总结JavaEE中一些常用的...Spring: Hibernate: SSH采用XML方式整合: SSH采用注解方式整合: 开发环境说明 eclipse:Luna Service Release
sa-token是一个轻量级Java权限认证框架,主要解决:登录认证,权限认证,会话会话,单点登录,OAuth2.0等长度权限相关问题框架针对踢人下线,自动续签,前后台分离,分散会话……等常见业务进行N多适应,通过sa-...
Jeecms是基于Spring注解,在自定义标签时对于实体类和dao service等注意注解的问题。 五 自定义标签及使用自己创建的表的实现过程 下面是我自己定义的标签mycontent_list 首先,在数据库里创建了一个jc_...
Mybatis的核心理念是将SQL语句与Java代码分离,通过XML或注解的方式将SQL配置在独立的文件中,避免了硬编码SQL带来的诸多问题。 首先,我们来探讨一下Mybatis的"增"操作。在Mybatis中,新增数据通常通过`insert`...
3. 使用`MultipartFile`处理文件:另一种方式是通过`@RequestParam`注解直接获取上传的文件,这样可以更方便地对单个文件进行操作。获取到`MultipartFile`对象后,可以直接操作文件流进行写入操作。 ```java @...