注解

@Repository 用于Dao实现类

@Service 用于业务实现类

@Controller 用于控制器实现类

@Component 通用

1. 所需环境

  1. 依赖

    <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.3.9</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>5.3.9</version>
    </dependency>
    
  2. 配置

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            https://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/aop
            https://www.springframework.org/schema/aop/spring-aop.xsd">
        <!--开启注解的支持-->
        <context:annotation-config/>
    </beans>
    
  3. 同时,也可以指定要扫描的包

    <context:component-scan base-package="org.gs.pojo"/>
    

2. 自动装配注解

2.1. 使用方法

使用注解

自动装配的注解有两种:@Autowired和@Resource,参见下文。

注解通过反射实现依赖注入。

@Autowired

@Autowired注解由Spring提供,只按照byType注入。

@Autowired默认按类型装配,默认情况下必须要求依赖对象存在,如果要允许null值,可以设置它的required属性为false。如果想使用名称装配可以结合@Qualifier注解进行使用。

public @interface Autowired {
    boolean required() default true;
}
@Qualifier(value = "xxx")

如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注解@Autowired完成的时候、我们可以使用@Qualifier(value = "xxx")去配合@Autowired的使用,指定一个唯一的bean对象注入。(byType + byName)

public class people{
  @Autowired
  private Cat cat;
  @Autowired
  // Qualifier指定的value即配置文件中的id或者name,在变量名dog与配置文件中的id或者name不同的时候可以用
  @Qualifier(value = "dog1")
  private Dog dog;
  private String name;
}

@Resource

@Resource注解由J2EE提供,默认按照byName自动注入

@Resource有两个重要的属性:name和type

Spring将@Resource注解的name属性解析为bean的名字,type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。

public class people{
  @Resource(name="cat")
  private Cat cat;
  @Resource
  private Dog dog;
}

@Resource和@Autowired的区别

  • @Autowired注解由Spring提供,只按照byType注入;@Resource注解由J2EE提供,默认按照byName自动注入。

  • @Autowired默认按类型进行装配,@Resource默认按照名称进行装配。

  • @Resource注解由J2EE提供默认通过byname的方式实现,如果找不到名字,则通过byType实现!如果两个都找不到的情况下,就报错!

  • @Autowired性能比较好一点。

  • @Autowired与@Resource都可以用来装配bean,都可以写在字段或setter方法上

3. 组件注册注解

3.1. bean注册@Component

package org.gs.pojo;
// 相当于 <bean class="org.gs.pojo.User" id="user"/>
// 其中 id为类名的全小写形式
@Component
public class User {
}

3.2. 属性注入的方式@Value(value)

package org.gs.pojo;
@Component
public class User {
  // 相当于 <property name="name" value="root"></property>
  // 同样可以用在setter方法的上面
  @Value("root")
  private String name;
}

3.3. @Component的几种衍生注解

@Component有几种衍生注解,在web开发中,会按照mvc三层架构分层。

  • dao--->@Repository
  • service--->@Service
  • controller--->@Controller

这四个注解的功能是一样的,都是代表将某个类注册到bean中,装配bean。

3.4. 自动装配

见上文。

3.5. 作用域@Scope(value)

和@Component组合使用,通常在@Component下面

package org.gs.pojo;
// prototype 多实例模式,singleton 单例模式
// 相当于xml配置bean的scope
@Component
@Scope("prototype")
public class User {
}

4. 使用注解实现AOP

详见这里

5. 其他注解

注解 描述
@Primary 声明bean的时候,将其中一个bean设置为首选(可理解为Autowired自动装配时的优先级)。
@Nullable 对字段设置表明该字段允许为空或者允许被传递空值。
@Import 只能作用在类上,通过快速导入的方式实现把实例加入到Spring的IoC容器中。
@ConditionalOnProperty(value, havingValue) 通过配置文件中的字段来判断是否生效。

5.1. Spring的三种注入方式

  1. @Autowired注入,Spring默认会在容器中找到对应的类型注入。最简单,不推荐

  2. 利用对象的setter方法来进行注入

    @Controller
    public class TestController {
      private TestService testService;
    
      @Autowired
      public void setTestService(TestService testService) {
          this.testService = testService;
      }
    }
    

    在Spring 3.x开始被推荐

  3. 构造器注入

    @Controller
    public class TestController{
        private final TestService testService;
        public TestController(TestService testService){
            this.testService = testService;
        }
    }
    

    As of Spring Framework 4.3, an @Autowired annotation on such a constructor is no longer necessary if the target bean only defines one constructor to begin with. However, if several constructors are available, at least one must be annotated to teach the container which one to use.

    在Spring4.3开始,如果Bean只有一个构造方法,那么Spring会使用这个构造方法自动注入所需依赖。因此当只需要一个全参构造方法时,也可以用Lombok的@AllArgsConstructor方法来同时注入多个依赖。

    @AllArgsConstructor
    public class AccountRelSiteController extends BaseController {
        private final XxxService xxxService;
        private final YyyService yyyService;
        private final ZzzService zzzService;
    }
    

    构造器注入是Spring最推荐的注入方式。

6. 小结

  1. xml万能,使用场合广泛,维护简单。
  2. 注解只能在自己的类中使用,维护复杂。
  3. 最佳使用场合:xml文件用来注册和管理bean,注解用来完成对属性的注入。
  4. 需要开启注解的支持,注解才会生效。
Copyright © rootwhois.cn 2021-2022 all right reserved,powered by GitbookFile Modify: 2023-03-05 10:55:52

results matching ""

    No results matching ""