ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

【Spring基础系列3】Spring常用的注解

【Spring基础系列3】Spring常用的注解 主要讲解Spring中常用的注解和使用姿势。前言前两篇文章分别讲解了Sping IOC的基础知识以及Spring通过注解装配Bean的常用方式包括Component、Repository、Service、Controller、Autowired、Resource和Qualifier这篇文章主要对剩余高频的注解进行讲解。ComponentScan之前我们都是在applicationContext.xml中指定扫描路径这样Spring才能将该包下面的注解扫描出来!--使用context命名空间通知spring扫描指定目录进行注解的解析-- context:component-scan base-packagecom.java.annotation/然后使用的时候需要引入配置文件ApplicationContext context new ClassPathXmlApplicationContext(classpath:applicationContext.xml); Pets petscontext.getBean(pets, Pets.class); System.out.println(pets.toString());通过xml配置的方式告诉扫描路径简直太Low了我们可以通过ComponentScan指定扫描路径然后通过Spring IoC容器的实现类AnnotationConfigApplicationContext去生成容器使用姿势如下Data Service ComponentScan({com.java.annotation.spring.bean.test5}) public class Pets { Resource private Dog dog; Resource private Cat cat; public static void main(String args[]) { ApplicationContext context new AnnotationConfigApplicationContext(Pets.class); Pets pets context.getBean(Pets.class); System.out.println(pets.toString()); } }那么Spring就会将com.java.annotation.spring.bean.test5包下面的Bean注册到Spring中包括Dog、Cat和Pets我之前的示例一直需要在配置文件中加入Pets的配置现在连下面这一行代码都省掉了是不是很酷// 直接省略掉 bean idpets classcom.java.annotation.spring.bean.test5.Pets/如果ComponentScan未指定路径那么默认只扫描当前的包所以需要实体和配置所在的包必须一致不过我们一般不这么用因为一般用该注解都需要指定路径。当然你也可以指定具体需要扫描的类不过这些都不常用知道有这个就行ComponentScan(basePackageClasses {Dog.class, Cat.class, Pets.class})未使用ComponentScan注解的代码示例可以参考文章《【Spring基础系列1】基于注解装配Bean》Configuration指示一个类声明一个或者多个Bean声明的方法并且由Spring容器统一管理以便在运行时为这些bean生成bean的定义和服务请求的类。我们先定义一个MyBean类public class MyBean { public MyBean(){ System.out.println(generate MyBean Instance); } public void init(){ System.out.println(MyBean Resources Initialized); } }然后再通过Configuration定义一个MyConfiguration环境配置类Configuration ToString public class MyConfiguration { private String name 配置测试; Bean public MyBean myBean(){ System.out.println(myBean Initialized); return new MyBean(); } }MyConfiguration是一个配置类能够在此类下面声明管理多个Bean我们声明了一个MyBean的bean希望它被容器加载和管理。我们来看一下测试用例public static void main(String[] args) { ApplicationContext context1 new AnnotationConfigApplicationContext(MyConfiguration.class); MyConfiguration myConfiguration context1.getBean(MyConfiguration.class); System.out.println(myConfiguration.toString()); } // 输出 // myBean Initialized // generate MyBean Instance // MyConfiguration(name配置测试)从输出的结果可以看到默认名称为myBean 的bean随着容器的加载而加载因为myBean方法返回一个myBean的构造方法所以myBean被初始化了然后MyConfiguration也作为一个Bean注入到Spring框架中。通过这种方式我们就省略了在XML中配置MyBean同时也省略了配置MyConfiguration和MyBean的依赖关系具体的XML配置我就不贴了如果大家看了我之前的两篇文章应该很容易写出来。BeanBean注解主要用于方法上有点类似于工厂方法当使用了Bean注解我们可以连续使用多种定义bean时用到的注解譬如用Qualifier注解定义工厂方法的名称用Scope注解定义该bean的作用域范围譬如是singleton还是prototype等。Spring 中新的 Java 配置支持的核心就是Configuration 注解的类。这些类主要包括 Bean 注解的方法来为 Spring 的 IoC 容器管理的对象定义实例配置和初始化逻辑除了和Configuration配合使用Bean自身也有一些特有的用法我再简单扩展一下。接受生命周期回调我们可以指定Bean的生命周期比如我们基于上述代码进行简单修改Configuration ToString public class MyConfiguration { private String name 配置测试; Bean(initMethod init) // 新增init public MyBean myBean(){ System.out.println(myBean Initialized); return new MyBean(); } }用同样的测试用例测试输出myBean Initialized generate MyBean Instance MyBean Resources Initialized // 新增输出 MyConfiguration(name配置测试)对于上面的例子也可以手动调用init()方法与上面的方式等效public MyBean myBean(){ System.out.println(myBean Initialized); MyBean myBean new MyBean(); myBean.init(); return myBean; }Bean的作用域默认情况下Spring应用上下文中所有bean都是作为以单例singleton的形式创建的。也就是不管给定的一个bean被注入到其他bean多少次每次所注入的都是同一个实例。大多数情况下单例bean是很理想的方案。初始化和垃圾回收对象实例所带来的成本只留给一些小规模任务在这些任务中让对象保持无状态并且在应用中反复重用这些对象可能并不合理。有时候所使用的类是易变的mutable它们会保持一些状态因此重用是不安全的。在这种情况下不应该将class声明为单例的bean因为对象会被污染重用的时候会出现意想不到的问题。Configuration ToString public class MyConfiguration { private String name 配置测试; Bean(initMethod init) Scope(prototype) // 新增作用范围 public MyBean myBean(){ System.out.println(myBean Initialized); return new MyBean(); } }Spring定义了多种作用域单例Singleton在整个应用中只创建bean的一个实例。原型Prototype每次注入或者通过Spring应用上下文获取的时候都会创建一个新的bean实例。会话Session在Web应用中为每个会话创建一个bean实例。请求Rquest在Web应用中为每个请求创建一个bean实例。通过XML定义的Bean都可以指定他们的作用域等同bean idlouzai classxxx scopeprototype /Bean其它用法Bean可以指定名称Bean(namelouzai) public MyBean myBean(){ System.out.println(myBean Initialized); return new MyBean(); }或者指定别名Bean({dataSource, dataSourceA, dataSourceB}) public MyBean myBean(){ System.out.println(myBean Initialized); return new MyBean(); }或者指定描述Bean(namelouzai) Description(此方法的bean名称为louzai) public MyBean myBean(){ System.out.println(myBean Initialized); return new MyBean(); }Bean主要和Configuration配合使用去获取配置文件中的配置数据这个等看到这一块我再完善这部分内容目前只给出基本用法。Transactional由于这个注解需要讲述的内容比较多一方面该注解非常重要另一方面非常容易入坑所以这个注解的内容就单独放到下一篇文章来讲。
返回列表