手撕Spring5框架(四)IOC操作Bean管理(基于注解)

什么是注解?

(1)代码里特殊的标记,格式:@注解名称(属性名称=属性值..)

(2)可以在类、方法、属性上添加注解。

使用注解的目的?

可以简化xml配置,使程序变得更简洁、优雅

注解的运用

创建对象提供的注解包含以下4个:

  • @Componet
  • @Service
  • @Controller
  • @Repository

特点:上面四个注解的功能都是一样的,都可以用来创建bean实例,建议使用在对应的功能层次中

注解 含义
@Component 最普通的组件,可以被注入到spring容器进行管理
@Repository 作用于持久层
@Service 作用于业务逻辑层
@Controller 作用于表现层,Controller类

属性注入提供的注解:

  • @Autowired
  • @Qualifier
  • @Resource
  • @Value

特点:@Autowired、@Qualifier、@Resource可以用于注入对象类型属性,@Value可以用户注入普通类型的属性。

注解 含义
@Autowired 根据属性类型进行自动装配
@Qualifier 根据属性名称进行注入
@Resource 可以根据属性、名称进行注入
@Value 注入普通类型的属性

基于注解实现创建对象

1)引入依赖

 <!-- spring-aop-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.2.8.RELEASE</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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!--开启组件扫描
	base-package属性:设置要扫描的包
	-->
    <context:component-scan base-package="org.leanr.spring5"></context:component-scan>
</beans>

3)类上添加注解

package org.leanr.spring5.service;

import org.springframework.stereotype.Service;

/**
 * 类上增加创建对象的注解
 * - @Componet
 * - @Service
 * - @Controller
 * - @Repository
 * value属性可以不设置,默认是类的名称,首字母小写,
 */
@Service(value = "userService")
public class UserService {
    public void add(){
        System.out.println("addddddd");
    }
}

4)编写测试类

package org.leanr.spring5;

import org.junit.Test;
import org.leanr.spring5.bean.User;
import org.leanr.spring5.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestSpring5 {
    /**
     * IOC操作Bean管理-注解方式创建对象
     */
    @Test
    public void test() {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        UserService userService = context.getBean("userService", UserService.class);
        System.out.println(userService);
        userService.add();
    }


}

测试类执行结果:

org.leanr.spring5.service.UserService@7920ba90
addddddd

组件扫描配置的细节

 <!--use-default-filters属性表示:是否开启默认的filter来扫描包下的内容
     默认是true,如果设置为false,则需要设置指定的规则
     例如下面设置的意思是,注解是@Controller在org.leanr.spring5包下扫描是生效的,其他注解类不会被扫描到
     -->
    <context:component-scan base-package="org.leanr.spring5" use-default-filters="false">
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
</beans>

基于注解实现属性的注入

第一步注解方式创建对象

第二步在类中注入外部属性,并添加属性的注解

1)@Autowired

@Service(value = "userService")
public class UserService {
    //注入属性的注解@Autowired,根据属性类型自动装入
    @Autowired
    private UserDao userDao;
    public void add(){
        System.out.println("userService add");

        userDao.add();
    }

2)@Qualifier

根据属性名称进行注入

/**
 * UserDao的实现类
 */
@Repository(value = "userDaoImpl2")
public class UserDaoImpl implements UserDao {
    public int add() {

        System.out.println("UserDaoImpl add ");
        return 1;
    }
}
@Service(value = "userService")
public class UserService {
    //注入属性的注解@Autowired,根据属性类型自动装入
    @Autowired
    @Qualifier(value = "userDaoImpl2")
    private UserDao userDao;
    public void add(){
        System.out.println("userService add");

        userDao.add();
    }

3)@Resource

既可以根据类型也可以名称注入

@Service(value = "userService")
public class UserService {
    //注入属性的注解@Autowired,根据属性类型自动装入
    //@Autowired
    //@Qualifier(value = "userDaoImpl2")
    //@Resource  //根据类型注入
    @Resource(value="userDaoimpl2")  //根据名称注解
    private UserDao userDao;
    public void add(){
        System.out.println("userService add");

        userDao.add();
    }

4)@Value

针对普通类型的属性注入

@Value(value = "zhangsan")
    private String userName;

纯注解开发

1)创建配置类,替代xml配置文件

package org.leanr.spring5.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
//Configuration,让Spring知道这是个配置类
@Configuration
@ComponentScan(basePackages = {"org.leanr.spring5"})
public class SpringConfig {
}

2)编写测试类

/**
     * 完全注解开发
     */
    @Test
    public void test3(){
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        UserService userService = context.getBean("userService", UserService.class);
        userService.add();
    }

猜你喜欢

转载自blog.csdn.net/java_cxrs/article/details/108331579