Programação Orientada à Interface do Spring - Criar Projeto da Web
- (1) Criar projeto (projeto Maven)
- (2) Criar Módulo (Maven webapp)
- (3) Defina os diretórios java, reousrces e test
- (4) A configuração depende de pom.xml
<dependencies>
<!--spring依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.9.RELEASE</version>
</dependency>
<!--日志包-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
Princípio de programação orientado a interface Spring
- (1) Definição da interface Interface
da classe de negócios com.xxx.service.IXxxService
Interface Dao com.xxx.dao.IXxxDao
- (2) Classe de implementação
com.xxx.service.impl.XxxServiceImpl
Com.xxx.dao.impl.XxxDaoImpl
- (3) Uma interface tem várias classes de implementação.
使用接口调用,将来更换实现类时,代码耦合度更低
Método de julgamento: os删除法
objetos da classe de implementação futura serão gerenciados pelo Spring, e as variáveis de membro serão usadas依赖注入
Implementação de programação orientada a interface Spring
- (1) PersonServiceImplTest
- (2) IPersonService
- (3) PersonServiceImpl
- (4) IPersonDao
- (5) PersonDaoImpl
- (6) Varredura de anotação Spring
- (7) Spring DI
变量等号左边使用接口调用方法,加上 spring的getBean或者注解注入,可以达成实现类的解耦。
PersonServiceImplTest
public class PersonServiceImplTest {
@Test
public void login() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
IPersonService service = context.getBean("PersonServiceImpl", PersonServiceImpl.class);
service.login();
}
}
IPersonService
public interface IPersonService {
public void login();
}
PersonServiceImpl
@Service
public class PersonServiceImpl implements IService {
//Autowired:Spring会自动创建实现类对象,并且将实现类对象赋值给dao
@Autowired
private IPersonDao dao;
@Override
public void login() {
System.out.println("Service调用Dao层代码");
dao.login();
}
}
IPersonDao
public interface IPersonDao {
public void login();
}
PersonDaoImpl
@Repository
public class PersonDaoImpl implements IPersonDao {
@Override
public void login() {
System.out.println("用户登录-进行数据库查询!");
}
}
Varredura de anotação de primavera
<?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 http://www.springframework.org/schema/context/spring-context.xsd">
<!--进行包扫描-->
<context:component-scan base-package="cn.cyl"/>
</beans>
Programação orientada a interface Spring - especifique a classe de implementação
- (1)
@Autowired
: Spring criará automaticamente o objeto de classe de implementação e atribuirá o objeto de classe de implementação ao dao.
Se houver apenas uma classe de implementação para esta interface no projeto, você pode usar Autowired.
No entanto, a interface tem duas ou mais classes de implementação. Lance uma exceção
como: PersonDaoImpl StudentDaoImp - (2)
@Qualifier
: Você pode especificar manualmente qual objeto de classe de implementação é atribuído à interface IPersonDao - (3) Os dois devem ser usados juntos
public class A{
@Autowired
@Qualifier("id值") 默认类名首字母小写
private B b;
}
- Exemplo
Adicione uma classe de implementação de IPersonDao
@Repository
public class StudentDaoImpl implements IPersonDao {
@Override
public void login() {
System.out.println("学生登录-进行数据库查询!");
}
}
É necessário adicionar @Qualifier
qual classe de implementação PersonServiceImpl é atribuída de acordo com o id do bean
@Service
public class PersonServiceImpl implements IService {
//Autowired:Spring会自动创建实现类对象,并且将实现类对象赋值给dao
@Autowired
//Qualifier:可以手动指定将哪一个实现类的对象赋值给IDao接口
@Qualifier("PersonDaoImpl")
private IPersonDao dao;
@Override
public void login() {
System.out.println("Service调用Dao层代码");
dao.login();
}
}