1. Spring IOC相关

  • IOC容器的使用分为注册bean和获取bean两大块:
    1. 注册bean: 通过注解注册一个bean有两种办法, 一种是给类加上@Component注解或其派生的@Controller, @Service, @Repository注解, 比较常用. 还有一种是使用@Configuration 搭配 @Bean注解, 常用在配置第三方提供的bean.
    2. 获取bean: 通过@Autowired或@Resource

  • @Component 以及 其派生 @Controller, @Service, @Repository
    • 位置: 注解在类上
    • 参数: 默认的bean的ID为首字母变为小写的类名
    • 作用:
      • @Component 相当于xml中的
      • @Component的语义更广、更宽泛,而@Repository、@Service和@Controller的语义则更具体
      • @Service, @Controller, @Repository = {@Component + some more special functionality}
      • 更多参考
Annotation Meaning
@Component generic stereotype for any Spring-managed component
@Repository stereotype for persistence layer
@Service stereotype for service layer
@Controller stereotype for presentation layer (spring-mvc)


  • @ComponentScan
    • 用处: 注解在类上
    • 作用: @ComponentScan对应XML配置形式中的<context: component-scan>元素, 用于配合一些元信息 Java Annotation,比如@Component和@Repository等, 将标注了这些元信息 Annotation 的 bean 定义类批量采集到 Spring 的IoC容器中, 我们可以通过 basePackages等属性来细粒度地定制 @ComponentScan自动扫描的范围, 如果不指定, 则默认 Spring框架实现会从声明 @ComponentScan所在类的 package 进行扫描。

  • @Configuration 搭配 @Bean
    • @Configuration
      • 位置: 注解在类上
      • 作用: 声明当前类是一个配置类,相当于一个Spring配置的xml文件, 任何POJO+@Configuration都是一个JavaConfig配置类。 @Configuration也是一个@Component
    • @Bean
      • 位置: 注解在方法上
      • 作用: 声明当前方法的返回值为一个Bean。
      • 1
        2
        3
        4
        5
        6
        7
        @Configuration
        public class TeslaServiceConfiguration {
        @Bean(name = "userService")
        public UserService userService() throws TeslaException {
        return TeslaServiceConsumerFactory.getTeslaServiceConsumer(UserService.class);
        }
        }


  • @Autowired 搭配 @Qualifier 或者 @Resource
    • 位置: 构造器, 方法, 属性等
    • 作用: Spring IOC容器会自动注入bean到这里.
    • @Resource和@Autowired使用起来区别不大, @Autowired优先byType装配, @Resource优先byName装配, 更多参考这里
    • @Autowired + @Qualifier(“foo”) 等同于 @Resource(name=”foo”)
    • 1
      2
      3
      4
      5
      6
      7
      8
      @Component 
      public class FXNewsProvider
      {
      @Autowired
      private IFXNewsListener newsListener;
      @Autowired
      private IFXNewsPersister newPersistener;
      }


  • Bean的生命周期 @Scope @PostConstruct 和 @PreDestroy
    • @Scope
      • 位置: 与@Component或@Bean一起使用
      • 作用: 用于指定bean的作用域.
      • 例子:
        • @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
        • @Scope(“prototype”)
    • 生命周期的钩子
      • initMethod & destroyMethod
        • 位置: 与@Bean搭配使用
        • 作用: 指定bean的生命周期回调方法, bean实例化后, bean销毁前
        • 例子: @Bean(initMethod=”init”,destroyMethod=”destory”)
      • @PostConstruct & @PreDestroy
        • 位置: 与@Component搭配使用, 注解在方法上
        • 作用: 指定bean的生命周期回调方法, bean实例化后, bean销毁前
        • 例子: @PostConstruct public void init() {}
        • 1
          2
          3
          4
          @PostConstruct
          public void init() {}
          @PreDestroy
          public void stop() {}


  • @Value
    • 位置: 方法, 属性等
    • 作用: 注入Spring配置
    • 例子: @Value(“${env}”) private String env;

2. SpringMVC

  • @Controller
    • 位置: 注解在类上
    • 作用: 标明这个类是SpringMVC里面的Controller. @Controller也是一个@Component, 会自动被IoC容器管理
  • @RequestMapping
    • 例子: @RequestMapping(value=”/hello”,method=RequestMethod.GET)
  • @RequestParam & @PathVariable 做参数绑定
    • 默认绑定
      • 请求参数名和方法参数名一致
    • 使用@RequestParam明确指定绑定关系
      • @RequestParam(value=”age” required=false) required默认是true
    • @PathVariable
      • @RequestMapping(value=”users/{userId}”, method=RequestMethod.GET)
      • foo(@PathVariable(“userId”) long userId)
  • @RequestBody
    • 添加 @RequestBody 后 Spring 会根据请求中的 Content-Type 头信息来选择合适的转换器, 将请求数据转为 Java 对象
    • 比如Content-Type是application/json, 那么就是 JSON -> Model
  • @ResponseBody
    • 添加 @ResponseBody 后 Spring 会根据请求中的 Accept 头信息来选择合适的转换器, Java 对象转化为客户端可接受的表述形式
    • 比如Accept头部信息包含“application/json”, 就是Model -> JSON
  • @RestController
    • @RestController 等于 @Controller + 每个方法默认加@ResponseBody
1
2
3
4
5
6
7
@RestController
public class HelloController {
@RequestMapping("/hello")
String hello() {
return "Hello World!";
}
}

3. Spring Boot相关

  • @SpringBootApplication
    • @Configuration
      • 启动类标注了@Configuration之后,本身其实也是一个IoC容器的配置类
    • @EnableAutoConfiguration
      • 从classpath中搜索所有META-INF/spring.factories配置文件, 加载配置到spring容器
      • spring-boot-autoconfig
      • 原理这里
    • @ComponentScan
      • 参见前文

4. Spring Cache

  • Spring提供了四个注解来声明缓存规则
注解 描述
@Cacheable 表明Spring在调用方法之前,首先应该在缓存中查找方法的返回值。如果这个值能够找到,就会 返回缓存的值。否则的话,这个方法就会被调用,返回值会放到缓存之中
@CachePut 表明Spring应该将方法的返回值放到缓存中。在方法的调用前并不会检查缓存,方法始终都会被 调用
@CacheEvict 表明Spring应该在缓存中清除一个或多个条目
@Caching 这是一个分组的注解,能够同时应用多个其他的缓存注解


  • @Cacheable注解有三个参数,value是必须的,还有key和condition。
    • value 第一个参数,也就是value指明了缓存将被存到什么地方。 (一个大容器里, 放了多个user-xxx)
    • key 任何存储在缓存中的数据为了高速访问都需要一个key。Spring默认使用被@Cacheable注解的方法的签名来作为key,当然你可以重写key,自定义key可以使用SpEL表达式。
    • condition SpEL表达式。但是这个参数将指明方法的返回结果是否被缓存。
1
2
@CachePut(value="spittleCache", key="#result.id") // 缓存的 key 为返回对象的id属性                   
Spittle save(Spittle spittle) {}
1
2
3
4
5
@Cacheable(value="spittleCache" 
unless="#result.message.contains('NoCache')" //返回的Spittle对象中如果其message属性包含 NoCache, 则不放到缓存
condition="#id >= 10" //只有id >= 10的才从缓存里找(既不希望将值添加到缓存中,也不希望从缓存中获取数据)
)
Spittle findOne(long id);
1
2
@CacheEvict("spittleCache")
void remove(long spittleId){} //移除缓存, key默认是spittleId

5. Test

  • @Test
    • @Test注解标注这个方法需要测试
    • 例子
      • @Test
      • public void testAdd(){}
  • @Before
    • 所有的测试方法之前都先执行这个方法
    • 例子
      • @Before
      • public void prepare(){}
  • @After
    • 所有的测试方法之后都要执行这个方法
    • 例子
      • @After
      • public void destroy(){}
  • 还有@BeforeClass @AfterClass等注解

参考: Spring实战, Spring揭秘, 官方文档, Spring常用注解汇总