基于配置文件的springIOC注入
前言: 在spring的学习中,依赖注入(ioc),面向切面编程(aop)是两个十分重要的知识点.正所谓spring的灵魂.
此处是通过用户登录案例实现ioc中依赖注入的其中一种方式–基于配置文件通过setter方法实现注入.
工具:idea+maven
一:使用idea创建maven项目:
1.项目目录结构如下:
二:导入项目所需的jar包(pom.xml).
<dependencies>
<!-- 引入测试工具-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- 引入spring核心容器所需的jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.11</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.11</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.3.11</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.11</version>
</dependency>
<!-- 日志依赖的jar包-->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
:只导入spring-context包maven也会根据依赖关系自动引入其他包,但是有版本限制就需要在配置文件中声明了.因为maven是声明优先.
三:编写代码.
1 数据准备:由于没有链接数据库,在此处通过一个类来模拟用户数据.
1.1 在top.shifuyouya.job.databasemodel包下创建数据库模拟类(UserDB),通过map集合存储多个用户.
package top.shifuyouya.job.databasemodel;
import top.shifuyouya.job.bean.User;
import java.util.HashMap;
import java.util.Map;
public class UserDB {
private static Map<Integer,User> userMap = new HashMap<>();
static {
userMap.put(1,new User(1,"张三","123"));
userMap.put(2,new User(2,"李四","123"));
userMap.put(3,new User(3,"王五","123"));
userMap.put(4,new User(4,"小红","123"));
}
public Map<Integer, User> getUserMap() {
return userMap;
}
}
2 在top.shifuyouya.job.bean包下创建用户实体类User:
package top.shifuyouya.job.bean;
public class User {
private Integer uid;
private String userName;
private String password;
public User() {}
public User(Integer uid, String userName, String password) {
this.uid = uid;
this.userName = userName;
this.password = password;
}
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"uid=" + uid +
", userName='" + userName + '\'' +
", password='" + password + '\'' +
'}';
}
}
3 编写持久层
3.1 在top.shifuyouya.job.dao包下编写用户持久层(UserDao).
其中包含一个login方法:
package top.shifuyouya.job.dao;
public interface UserDao {
public boolean login(String userName,String password);
}
3.2 在top.shifuyouya.job.dao.impl下编写UserDao的实现类(UserDaoImpl).
package top.shifuyouya.job.dao.impl;
import top.shifuyouya.job.bean.User;
import top.shifuyouya.job.dao.UserDao;
import top.shifuyouya.job.databasemodel.UserDB;
import java.util.Map;
public class UserDaoImpl implements UserDao {
UserDB userDB;
User user;
public void setUser(User user) {
this.user = user;
}
public void setUserDB(UserDB userDB){
this.userDB = userDB;
}
@Override
public boolean login(String userName, String password) {
Map<Integer, User> userMap = userDB.getUserMap();
for(Integer key:userMap.keySet()){
user = userMap.get(key);
if (user.getUserName().equals(userName) && user.getPassword().equals(password)){
return true;
}
}
return false;
}
}
4 编写业务层
4.1 在top.shifuyouya.job.service包中编写业务接口(UserService)
其中包含一个罗login方法
package top.shifuyouya.job.service;
public interface UserService {
public boolean login(String userName,String password);
}
4.2 在top.shifuyouya.job.service.impl包中编写Uservice的实现类(UserServiceImpl)
package top.shifuyouya.job.service.impl;
import top.shifuyouya.job.dao.UserDao;
import top.shifuyouya.job.service.UserService;
public class UserServiceImpl implements UserService {
UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public boolean login(String userName, String password) {
return userDao.login(userName,password);
}
}
5 编写spring配置文件.
在resource目录下编写名为(aplicationContext.xml)的配置文件.
使用bean标签实例化各个bean类.
在需要注入参数的实例中通过property标签注入参数,其中name的值属性名.value的值是注入的参数,
ref的值是引用bean的名称或id.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userdb" class="top.shifuyouya.job.databasemodel.UserDB"></bean>
<bean id="user" class="top.shifuyouya.job.bean.User"></bean>
<bean id="userDao" class="top.shifuyouya.job.dao.impl.UserDaoImpl">
<property name="userDB" ref="userdb"></property>
<property name="user" ref="user"></property>
</bean>
<bean id="userService" class="top.shifuyouya.job.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
</beans>
6 编写测试类(使用junit)
在test/java目录下编写测试类(UserTest).
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import top.shifuyouya.job.service.UserService;
public class UserTest {
@Test
public void loginTest(){
ApplicationContext application = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) application.getBean("userService");
String userName = "小红";
String password = "123";
if(userService.login(userName,password)){
System.out.println(userName + "登录成功");
}else{
System.out.println("用户名或密码错误!");
}
}
}
:这里需要注意的是junit是自动化测试工具,所以测试数据不能使用Scanner类来获取用户主动输入.否则他会一转转圈圈,犹如进入了死循环.
7 测试结果:
:此处省略了controller层
完整的代码: https://gitee.com/cat_y/spring-study
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)