Spring零碎知识收集

这篇博客主就是一个废品收购站,看见什么收什么(滑稽)。

  • @DateTimeFormat

    • 这个注解一般用在实体类的Date类型属性上,它可以将页面传递来的String类型日期转换为Date类型,但在4.0之前强依赖于joda-time.jar ,必须要引入这个包才可以使用,4.0之后不再强依赖于这个jar包。
  • <%@ taglib uri=”http://java.sun.com/jsp/jstl/fmt" prefix=”fmt” %>

    • 这是一个jstl标签,其中有很多格式化的方法,比如格式化日期,数字等等,此处只做一个简单的记录,有需求可以直接百度,食用度不难。
  • @Configuration

    • 这个注解相当于xml中的<beans><beans/>标签,可以表明这个类是一个配置类,在SpringBoot中可能会用的比较多,而且在SpringBoot中不用开启注解扫描也可以直接使用。
  • @ComponentScan

    • 这个注解会开启注解扫描,有属性值value,相当于base-package。一般在配置类上使用,若不配置这个属性,它会默认以配置类所处的包为base-package来扫描组件。
  • @Component

    • 和@Controller,@Service这些用法一样,一般用于实例化实体类。
  • @Named(“”)

    • 这个注解和上一个注解的用处一样,引号中的字符串可以当作bean的别名,@Component也可以通过这种方式来指定别名。
  • @RunWith(SpringJUnit4ClassRunner.class)

    • 这个注解可以用在测试类上,测试时会自动加载Spring上下文。
  • @ContextConfiguration(class=XXX.class)

    • 测试时与上一个注解搭配使用,这个注解可以指明哪一个类是配置类。
  • @Inject

    • 这个注解和@Autowired一样都是用于bean的自动装配,它和@Named注解都来自于Java的依赖注入规范,大部分情况下这两个注解是可以互相替换的。
  • @Bean(name=””)

    • 这个注解相当于XML配置文件中的<bean></bean>标签,用于方法上,它可以通知Spring该方法会返回一个对象,这个对像将要注册为Spring应用上下文的bean。用这种方法创建bean时,使我们有了在方法体中执行复杂逻辑的可能性,因为这完全是基于Java代码的,无论逻辑多复杂,只要最终返回一个实力就行。另外当一个方法已经使用了这个注解后,Spring会拦截所有对它的访问,如果它已经创建了一个bean,,就会直接返回这个bean,而不是每次都对其进行实际的调用
  • Spring配置的三种主要方式

    • 自动化配置
      • 工作时一般都使用这种方法,目前接触的项目多数情况下还会搭配XML,使用方法一般都是在XML里开启组件扫描,同时配置数据库,事务,拦截器等等,然后在代码中的使用@Controller,@Service,@Autowired这些注解。
      • 虽然自动化配置很方便,但有些时候必须要显示的进行一些配置,比如在使用第三方的一些组件时,我们就没有办法去给它添加注解,除了上面所说的搭配XML,我们还可以搭配JavaConfig(基于Java的显示配置),使用这种方法时我们会创建一个类来取代XML,当我们为这个类加上@Configuration注解时,它就会被Spring认为是一个配置类,同时Spring也提供了大量的注解来对应XML中的标签,以便我能够实现所有XML中能够实现的功能,而且这种方法比XML更加强大。
    • 基于Java的显示配置
      • 正如上面所说的,我们在使用这种方法时可以创建一个类来取代XML,通过@Configuration来申明它是一个配置类,通过@ComponentScan来开启组件扫描,通过@Bean来创建实例等等,可能还有其它许多注解,但此处只做简单描述,未来可能在SpringBoot的学习中详细记录这种方式。
    • 基于XML的显示配置
      • 最原始的方法,见过无数次的<bean><bean/>标签,<property/>标签等等,百度一抓一大把,基本也没什么可说的了。
  • @Import(XXX.calss)

    • 这个注解相当与XML中的<import>标签,在4.2前只能导入配置类,在4.2之后,@Import注解支持导入普通的Java类,并将其声明成一个bean ,当一个JavaConfig配置的内容过多,我们可以将其拆分为两个或更多的JavaConfig,通过使用这个注解将多个JavaConfig进行统一。同时也可以使用@Import({XXX.class,XXX.class})一次引入多个JavaConfig。
  • @ImportResource(“classpath:”)

    • 这个注解和上一个注解的用处一样,是用来引入XML配置文件的
  • 条件化的bean

    • 当我们希望一个bean只有在满足一定的条件下时才会被创建,可以在方法上使用@Conditional(XXX.class)注解,XXX是一个我们自定义的类,它必须实现Condition接口,并且重写matches()方法,当这个方法返回true时,这个bean就会被创建,如果返回false,则不会创建。
  • @Qualifier(“”)

    • 这个注解可以配合@Autowired或@Inject使用,这个注解应用于有一个以上的bean可以匹配自动装配,比如一个接口有三个实现类,在自动装配时使用的参数类型是接口而不是实现类,这时Spring就会无法分辨你想要将哪一个子类注入,便会抛出异常。@Qualifier(“”)注解可以通过在””中指明限定符(默认情况下使用bean的id即可),从而准确的注入我们想要的bean。我们也可以不使用bean的id,自己来定义限定符,将@Qualifier(“”)和@Component,@Bean这类用于实例化的一起使用,””中的内容就是自定义的限定符
  • @Scope()

    • 这个注解是用来声明bean的作用域的,在Spring中默认的作用域为Singleton,我们可以通过value属性将其改变为Prototype(多例),Session(会话),Request(请求)
    • proxyMode属性:这个属性可以解决将Session或Request作用域的bean注入到单例bean中所遇到的问题。当向一个单例的bean注入Session范围的或Request范围的bean时,它们此时并没有创建,直到一个用户发起了一个会话或进行了一次请求,它们才会被创建。
      • 以电子商务中的购物车系统为例,ShoppingCart实例的作用范围都是Session,而处理业务的ShoppingCartService都是单例的,当我们向ShoppingCartService中注入一个ShoppingCart时,这个ShoppingCart可能还没有被创建,直到一个用户发起了一次会话,ShoppingCart才会被创建,另外在向ShoppingCartService注入ShoppingCart时,我们并不希望注入的是一个固定的ShoppingCart实例,我们希望的时当ShoppingCartService处理购物车功能时,它所使用的ShoppingCart正好是当前会话的对应的那一个。所以Spring会注入一个ShoppingCart bean的代理,这个代理会暴露与ShoppingCart相同的方法,所以ShoppingService会认为它就是一个ShoppingsCart,但是在调用ShoppingCart中的方法时,代理会对其进行懒解析并将调用委托给会话作用域内真正的ShoppingCart bean。这个属性有两个常用的值,以ShoppingCart为例,假如ShoppingCart是一个接口,那么proxyMode的值是ScopedProxyMode.INTERFACES,如果ShoppingCart是一个类,那么proxyMode的值是ScopedProxyMode.TARGET_CLASS
    • <aop:scoped-proxy>:这个标签就是XML中proxyMode的用法,默认使用ScopedProxyMode.TARGET_CLASS,也可以将proxy-target-class设为false,将其变成基于接口的代理,需要注意的是使用这个注解需要开启aop命名空间。
  • Spring中关于AOP的一些注解

    • @EnableAspectJAutoProxy:这个注解可以用在配置类上,作用与组件扫描类似,开启之后可以识别@Aspect注解,如果是在XML中,可以使用Spring aop命名空间中的<aop:aspectj-autoproxy>
    • @Aspect:这个注解可以标明一个类是切面。
    • @Before():应用这个注解的方法会在目标方法调用之执行。
    • @After():应用这个注解的方法会在目标方法调用之执行。
    • @AfterReturning():应用这个注解的方法会在目标方法返回后执行。
    • @AfterThrowing():应用这个注解的方法会在目标方法抛出异常后执行。
    • @Around():应用这个注解的方法会在目标方法执行之前与执行之后执行。
    • @Pointcut():这个注解能够在切面内定义可以复用的切点。
  • 如果使用基于Java的配置方式作为配置文件,在配置web.xml时需要注意两点:

    • 在配置上下文关系时,原先指定xml的路径要变成JavaConfig的路径

    • 要额外在web.xml中声明使用Java配置

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      <context-param>
      <param-name>contextClass</param-name>
      <param-value>
      org.springframework.web.context.support.AnnotationConfigWebApplicationContext
      </param-value>
      </context-param>

      在servlet标签中使用
      <init-param>
      <param-name>contextClass</param-name>
      <param-value>
      org.springframework.web.context.support.AnnotationConfigWebApplicationContext
      </param-value>
      </init-param>