1、概述
-
Spring 是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替 XML 配置文件可以简化配置,提高开发效率。
-
当然,开发时具体策略是说“完全使用注解,完全抛弃 XML 配置文件”还是“注解与 XML 配置文件结合使用”,根据实际情况。
2、Spring 中常见注解
Spring-223、使用注解开发举例
- 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);
}
}
网友评论