简单介绍:
装配就是赋值的方式。装配,注入和赋值说的都是一回事,Spring的装配方式主要有三种,基于XML文件的装配,基于注解的装配和自动装配。我们主要讲解基于注解的装配和自动装配,基于XML文件的装配和之前我们学依赖注入的时候的操作是一样的。
使用方法:
首先是基于注解的装配:
基于注解的装配主要理解在注册三个组件中使用不同的注解进行区分。
注解 | 描述 |
@Component | 指定一个普通的Bean |
@Contorller | 指定一个控制组件的Bean |
@Service | 指定一个业务逻辑层的Bean |
@Repository | 指定一个数据访问组件Bean |
@scope | 指定Bean组件的作用域 |
@Value | 指定Bean实例的注入值 |
@Autowired | 指定要自动装配的对象 |
@Resource | 指定要注入的对象 |
@Qualifier | 指定要自动装配的对象的名称,通常与@Autowired联用 |
@PostConstruct | 指定Bean完成初始化后要执行的方法 |
@PreDestroy |
指定Bean执行销毁前执行的方法 |
前四个注解主要是和Bean的创建有关,后两个是跟Bean的装配有关,后面三个跟Bean的自动装配有关,最后两个是Bean的生命周期有关,关于Bean的生命周期是我们下一章要介绍的内容。
我们的主要关注点在于最上面的四个注解,这四个注解的作用都相当于是XML配置文件中的<bean>标签的作用是一样的,都是在IoC容器中注册一个Bean对象,唯一的区别就是在注册Bean的时候会顺便指出这个Bean是属于哪一个组件,作用是规范我们的代码的编写。
三个组件对应的就是我们应用程序的三控制组件,业务逻辑组件,数据访问组件。
在正式的使用基于注解的装配之前,我们还需要在Bean管理XML配置文件中添加一些约束和Bean的自动扫描功能。这个自动扫描就是用来扫描我们包下面的所有类中的注解,这样我们就可以使用注解进行我们的Bean管理了。
<?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
http://www.springframework.org/schema/context/spring-context">
<!-- 配置包扫描器,用来扫描包下面的注解-->
<context:component-scan base-package="com.spring"/>
</beans>
接下来我们就从一个小案例出发,对这些注解进行一个代码实现,帮助我们理解这些理论。我们现在要实现一个模拟登录,当我们输入的密码和我们设定的密码一致的时候显示登录成功,否则登录失败。
在这个案例中,我们会演示三个层的一个基本架构,关键要理解这三个层是如何互相配合起来的:
先来看一眼这个文件结构,这里只是大致的演示了一下大概的逻辑结构,真实的逻辑结构会更加的严谨和专业,我只是大致的描述了一下三个结构关系。记住接口只是用来制定规则的,真正的实现方法的过程是在实现这个方法的类中。 我们的执行流程大致是这样的,我们访问的时候会去调用server层,然后在server中会先处理我们的请求,之后会将我们的请求转发到controller层中,我们的转发就非常的简单了,就是调用了一下控制层的方法而已。然后控制层会处理我们请求中的逻辑操作,比如添加日志,或者做一些其他的操作。之后就是调用DAO层去和数据库做持久化的交互操作。然后将最后的结果由控制层返回到server层输出到控制台上。
大致的逻辑结构就是这样的,然后我们来看具体的代码:
首先是控制层:
package com.spring.Imp;
import com.spring.Controller.userLoginCon;
import org.springframework.stereotype.Controller;
import javax.annotation.Resource;
@Controller("userLoginConImp")
public class userLoginConImp implements userLoginCon {
@Resource(name = "userLoginDAOImp")
userLoginDAOImp sld = null;
@Override
public void Login(String name, String password) {
sld.userLogin(name,password);
}
}
然后是DAO层:
package com.spring.Imp;
import com.spring.DAO.userLoginDAO;
import org.springframework.stereotype.Repository;
@Repository("userLoginDAOImp")
public class userLoginDAOImp implements userLoginDAO {
@Override
public void userLogin(String name, String password) {
if(name.equals("张三")&&password.equals("123456")){
System.out.println("登陆成功!");
}else {
System.out.println("登陆失败!");
}
}
}
最后是Server层:
package com.spring.Imp;
import com.spring.Server.userLoginServer;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service("userLoginServerImp")
public class userLoginServerImp implements userLoginServer {
@Resource(name = "userLoginConImp")
userLoginConImp slc = null;
@Override
public void Login(String name, String password) {
slc.Login(name,password);
}
}
我们只是给了接口的实现类,至于接口,接口只是用来定义规则的,里面就定义了一个Login的方法,什么都没有,自己写就行了。
最后是测试类:
import com.spring.Server.userLoginServer;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Scanner;
public class textLogin {
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext("userBeanContext.xml");
userLoginServer uls = (userLoginServer) ac.getBean("userLoginServerImp");
Scanner input = new Scanner(System.in);
System.out.println("请输入姓名:");
String name = input.next();
System.out.println("请输入密码:");
String password = input.next();
uls.Login(name,password);
}
}
需要我们注意的地方有两个:
以控制层的代码为例,上面的红框中使用了@Controller注解,这样做不仅可以向容器中注册这个Bean,还能让人一看就看出来这是一个属于控制层的类,增加了我们代码的可读性和规范性。下面的红框中我们引用了DAO层的对象,然后我们需要装配这个对象,那么我就需要使用@Resource注解来装配对象,name的值指向的就是我们需要装配的对象的id的值,也就是注解中的值。意思就是说我现在需要userLoginDAOImp的类,那么我就可以通过@Resource注解来获取注册到IoC容器中的 userLoginDAOImp类的值,如何找到这个类,就是通过userLoginDAOImp类注册的时候在注解中填入的字符串,两个字符串相同,就能找到这个类。
然后来看运行结果:
通过上面的例子可以看到,我们的装配过程非常的麻烦且繁琐。
注意点:
在装配这一环节中,我们需要注意的就是向IoC容器注册Bean类的四个注解,其实他们的功能都是一样的,只不过是使用不同的注解可以帮助我们提高代码的可读性和可维护性。以及我们在指定装配的对象的时候一定要注意装配的类一定要写对,否则会找不到我们要装配的类。