spring-基于注解管理bean

基于注解管理bean

  • 一、标记与扫描
    • 1、引入依赖
    • 2、创建spring配置文件
    • 3、创建组件
    • 4、扫描组件
      • 4.1、基本扫描:
      • 4.2、指定要排除的组件
      • 4.3、仅扫描指定组件
  • 二、基于注解的自动装配


一、标记与扫描

1、引入依赖

<dependencies>
<!-- 基于Maven依赖传递性,导入spring-context依赖即可导入当前所需所有jar包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.1</version>
</dependency>
<!-- junit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>

2、创建spring配置文件

spring-基于注解管理bean_第1张图片

3、创建组件

创建控制层组件

@Controller
public class UserController {
}

创建接口UserService

public interface UserService {
}

创建业务层组件UserServiceImpl

@Service
public class UserServiceImpl implements UserService {
}

创建接口UserDao

public interface UserDao {
}

创建持久层组件UserDaoImpl

@Repository
public class UserDaoImpl implements UserDao {
}

识为业务层组件 @Repository:将类标识为持久层组件
问:以上四个注解有什么关系和区别?
@Controller、@Service、@Repository这三个注解只是在@Component注解
的基础上起了三个新的名字。
对于Spring使用IOC容器管理这些组件来说没有区别。所以@Controller、@Service、@Repository这
三个注解只是给开发人员看的,让我们能够便于分辨组件的作用。
注意:虽然它们本质上一样,但是为了代码的可读性,为了程序结构严谨我们肯定不能随便胡乱标记。

4、扫描组件

4.1、基本扫描:

 <context:component-scan base-package="com.spring.autowired">
    </context:component-scan>

4.2、指定要排除的组件

    <context:component-scan base-package="com.spring.autowired">
        
        
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <context:exclude-filter type="assignable" expression="com.spring.autowired.controller.UserController"/>
    context:component-scan>

4.3、仅扫描指定组件

    <context:component-scan base-package="com.spring.autowired" use-default-filters="false">
        
        
        
        
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
        <context:include-filter type="assignable" expression="com.spring.autowired.controller.UserController"/>
    context:component-scan>

测试

@Test
public void testAutowireByAnnotation(){
ApplicationContext ac = new
ClassPathXmlApplicationContext("applicationContext.xml");
UserController userController = ac.getBean(UserController.class);
System.out.println(userController);
UserService userService = ac.getBean(UserService.class);
System.out.println(userService);
UserDao userDao = ac.getBean(UserDao.class);
System.out.println(userDao);
}

注意:
组件所对应的bean的id
在我们使用XML方式管理bean的时候,每个bean都有一个唯一标识,便于在其他地方引用。现在使用注解后,每个组件仍然应该有一个唯一标识。
默认情况
类名首字母小写就是bean的id。例如:UserController类对应的bean的id就是userController。
自定义bean的id,可通过标识组件的注解的value属性设置自定义的bean的id
@Service(“userService”)//默认为userServiceImpl public class UserServiceImpl implements
UserService {}

二、基于注解的自动装配

@Autowired注解
在成员变量上直接标记@Autowired注解即可完成自动装配,不需要提供setXxx()方法。
@Autowired注解其他细节:
(1)@Autowired注解可以标记在构造器和set方法上
(2)@Autowired工作流程
在这里插入图片描述
spring-基于注解管理bean_第2张图片
首先根据所需要的组件类型到IOC容器中查找

  • 能够找到唯一的bean:直接执行装配
  • 如果完全找不到匹配这个类型的bean:装配失败
  • 所需类型匹配的bean不止一个
    • 没有@Qualifier注解:根据@Autowired标记位置成员变量的变量名作为bean的id进行匹配
      • 能够找到:执行装配
      • 找不到:装配失败
    • 使用@Qualifier注解:根据@Qualifier注解中指定的名称作为bean的id进行匹配
      • 能够找到:执行装配
      • 找不到:装配失败

@Autowired是Spring框架中的一种注解,用于自动装配bean。其中有一个属性required,默认值为true。如果在容器中找不到对应的组件,则报错。如果属性required的值为false,则在容器中找不到对应的组件时不报错。但是实际开发时,基本上所有需要装配组件的地方都是必须装配的,用不上这个属性。

你可能感兴趣的:(spring,java,后端)