美文网首页
109、【JavaEE】【Spring】Spring 注解开发(

109、【JavaEE】【Spring】Spring 注解开发(

作者: yscyber | 来源:发表于2021-10-24 03:44 被阅读0次

    1、概述

    • Spring 是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替 XML 配置文件可以简化配置,提高开发效率。

    • 当然,开发时具体策略是说“完全使用注解,完全抛弃 XML 配置文件”还是“注解与 XML 配置文件结合使用”,根据实际情况。

    2、Spring 中常见注解

    Spring-22

    3、使用注解开发举例

    • 1、在核心配置文件src/main/resources/applicationContext.xml中开启“注解扫描”
    <?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 https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    
         <!-- 开启“注解扫描”,使得 Spring 能够识别该包下注解 --->
        <context:component-scan base-package="com.yscyber.spring"/>
    
    </beans>
    
    • 2、创建UserRepo接口和UserRepoImpl实现类,在UserRepoImpl上添加注解@Repository,将该类的对象交给 Spring 容器进行管理
    public interface UserRepo {
    
        int deleteUserById(String id);
    
    }
    
    import com.yscyber.spring.two.repo.UserRepo;
    
    import org.springframework.stereotype.Repository;
    
    @Repository
    public class UserRepoImpl implements UserRepo {
    
        @Override
        public int deleteUserById(String id) {
            System.out.println("删除用户...");
            return 1;
        }
    
    }
    
    • 3、创建UserService接口和UserServiceImpl实现类,在UserServiceImpl上添加注解@Service,将该类的对象交给 Spring 容器进行管理。另外,由于 Service 层要使用 Repository 层,所以将UserRepo对象作为UserService的成员变量,这个时候,需要依赖注入,使用@Autowired注解
    public interface UserService {
    
        int deleteUserById(String id);
    
    }
    
    import com.yscyber.spring.two.repo.UserRepo;
    import com.yscyber.spring.two.service.UserService;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    @Service
    public class UserServiceImpl implements UserService {
    
        @Autowired
        private UserRepo userRepo;
    
        @Override
        public int deleteUserById(String id) {
            return userRepo.deleteUserById(id);
        }
    
    }
    
    • 4、
        @Test
        public void test1() {
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    
            UserService userService = applicationContext.getBean(UserService.class);
    
            userService.deleteUserById("1");
        }
    

    4、控制反转使用的注解

    • @Component@Controller@Service@Repository
      将类的对象交给 Spring 容器(IoC 容器)管理。

    • @Component(value = "")value相当于<bean id="" class=""/>中的id

    5、依赖注入使用的注解

    • @Autowired@Qualifier@Resource
      负责依赖注入

    • @Autowired:根据类型注入。

    • @Qualifier:与@Autowired结合使用,需要根据 id 来区别注入的类型(比如:多态下,接口有多个实现类),一般使用@Autowired就足够了,很少去结合使用@Qualifier

    public interface UserRepo {
    
        int deleteUserById(String id);
    
    }
    
    import com.yscyber.spring.three.repo.UserRepo;
    
    import org.springframework.stereotype.Repository;
    
    @Repository("userRepoImpl1")
    public class UserRepoImpl1 implements UserRepo {
    
        @Override
        public int deleteUserById(String id) {
            System.out.println("实现类1");
            return 1;
        }
    
    }
    
    import com.yscyber.spring.three.repo.UserRepo;
    
    import org.springframework.stereotype.Repository;
    
    @Repository("userRepoImpl2")
    public class UserRepoImpl2 implements UserRepo {
    
        @Override
        public int deleteUserById(String id) {
            System.out.println("实现类2");
            return 1;
        }
    
    }
    
    public interface UserService {
    
        int deleteUserById(String id);
    
    }
    
    import com.yscyber.spring.three.repo.UserRepo;
    import com.yscyber.spring.three.service.UserService;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Service;
    
    @Service
    public class UserServiceImpl implements UserService {
    
        @Autowired
        @Qualifier("userRepoImpl2") // 使用 @Qualifier 区分到底注入的是 UserRepoImpl1 还是 UserRepoImpl2
        private UserRepo userRepo;
    
        @Override
        public int deleteUserById(String id) {
            return userRepo.deleteUserById(id);
        }
    
    }
    
    • @Resource:相当于@Autowired@Qualifier("······"),很少使用。需要注意的是,这个注解属于javax包,这个包在 Java 11 之后已经被移除,所以如果还想使用这个注解,需要引入一个 Maven 依赖
    <dependency>
        <groupId>javax.annotation</groupId>
        <artifactId>javax.annotation-api</artifactId>
        <version>1.3.2</version>
    </dependency>
    
    import com.yscyber.spring.three.repo.UserRepo;
    import com.yscyber.spring.three.service.UserService;
    
    import org.springframework.stereotype.Service;
    
    import javax.annotation.Resource;
    
    @Service
    public class UserServiceImpl implements UserService {
    
        @Resource(name = "userRepoImpl2") // 替代 @Autowired 和 @Qualifier("······") 
        private UserRepo userRepo;
    
        @Override
        public int deleteUserById(String id) {
            return userRepo.deleteUserById(id);
        }
    
    }
    

    相关文章

      网友评论

          本文标题:109、【JavaEE】【Spring】Spring 注解开发(

          本文链接:https://www.haomeiwen.com/subject/aielaltx.html