Spring框架提供了三种bean的装配方法:xml显式装配、javaConfig显式装配、注释隐式装配
我用一个简单的例子来说明xml配置
(代码已经上传到github上了:传送门)
DBHelper
package utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBHelper {
private static final String driver = "com.mysql.cj.jdbc.Driver";
private static final String url = "jdbc:mysql://localhost:3306/webtest?useSSL=false";
private static final String username = "root";
private static final String password = "123456";
private static Connection conn = null;
static{
try {
Class.forName(driver);
}catch (ClassNotFoundException e){
e.printStackTrace();
}
}
public static Connection getConnection(){
if(conn==null){
try{
conn = DriverManager.getConnection(url,username,password);
System.out.println("数据库初始化成功");
}catch (SQLException e){
e.printStackTrace();
System.out.println("数据库初始化失败");
}
}
return conn;
}
}
User
package pojo;
public class User {
private int user_id;
private String username;
private String password;
private int user_age;
public int getUser_id() {
return user_id;
}
public void setUser_id(int user_id) {
this.user_id = user_id;
}
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;
}
public int getUser_age() {
return user_age;
}
public void setUser_age(int user_age) {
this.user_age = user_age;
}
public User() {
}
/**
* 这里我调用了super.toString()方法是为了看User实例的ID
* */
@Override
public String toString() {
return "User{" +
"user_id=" + user_id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", user_age=" + user_age +
'}' + " @@ " + super.toString();
}
}
UserDao
package dao;
import pojo.User;
public interface UserDao {
public User searchUser();
public int updateUser();
public int deleteUser();
public int createUser();
}
UserDaoImpl
package dao.impl;
import dao.UserDao;
import pojo.User;
import utils.DBHelper;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class UserDaoImpl implements UserDao {
private User user;
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
public void setUser(User user) {
this.user = user;
}
@Override
public User searchUser() {
return null;
}
@Override
public int updateUser() {
return 0;
}
@Override
public int deleteUser() {
return 0;
}
@Override
public int createUser() {
return 0;
}
public User selectByUsername(String userName){
String sql = "select * from wt_user where username = " + "'" + userName + "'";
System.out.println(sql);
conn = DBHelper.getConnection();
try {
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
if (rs.next()){
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setUser_id(rs.getInt("user_id"));
user.setUser_age(rs.getInt("user_age"));
}else {
user = null;
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
if (rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return user;
}
}
LoginService
package service;
import dao.impl.UserDaoImpl;
import pojo.User;
public class LoginService {
private User user;
private UserDaoImpl userDaoImpl;
public void setUser(User user) {
this.user = user;
}
public void setUserDaoImpl(UserDaoImpl userDaoImpl) {
this.userDaoImpl = userDaoImpl;
}
public void login(User u){
System.out.println("print1:" + u);
user = userDaoImpl.selectByUsername(u.getUsername());
System.out.println("print2:" + user);
System.out.println("print3:" + u);
if (user != null){
System.out.println(user.getUsername());
System.out.println(user.getPassword());
if (user.getPassword().equals(u.getPassword())){
System.out.println("登陆成功");
}else {
System.out.println("登陆失败");
}
}else {
System.out.println("登陆失败");
}
}
}
spring ioc有两种情况:set方法/构造函数
我们这里使用set方法注入
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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="user" class="pojo.User"></bean>
<bean id="userDaoImpl" class="dao.impl.UserDaoImpl">
<property name="user" ref="user"></property>
</bean>
<bean id="loginService" class="service.LoginService">
<property name="userDaoImpl" ref="userDaoImpl"></property>
</bean>
</beans>
test
package test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import pojo.User;
import service.LoginService;
import utils.DBHelper;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class t1Test {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
User user = null;
LoginService loginService = null;
@Test
public void test2(){
User user = null;
ApplicationContext contest = new ClassPathXmlApplicationContext("applicationContext.xml");
loginService = (LoginService)contest.getBean("loginService");
user = (User)contest.getBean("user");
user.setUsername("martin");
user.setPassword("root");
loginService.login(user);
}
}
结果如下:(请注意print1~3这三个打印的是什么)
注意:
1、ref是<beans>标签中声明过的bean的id,如果要注入user实例中的某个属性如username则ref ---> value
2、由于我们在userDaoImpl中注入过user实例,所以loginService中注入了userDaoImpl之后不需要再次声明配置注入user
<bean>标签配置实例的时候有一个选填scope的属性,默认是singleton(单例),另一个属性值是prototype(多)
上面的结果建立在默认的scope属性下,即通过spring创建的属性都是同一个实例,所以我挖了坑你们发现没呢?请注意那三个print。可以看到console中输出的user实例的id都是一样的。这是因为虽然我们先创建了一个user_id为0的user实例,但是传入login方法中后,又进行了一次查询后得到了user(数据库中的user_id为415),虽然有两个对象名u和user,但由于只创建了一个user,也就相当一直在对同一个对象赋值。这就是单例模式。
但是有些操作的时候需要我们创建两个对象,这就要用到scope属性了,只要如下增加一个属性即可
<bean id="user" class="pojo.User" scope="prototype"></bean>
这样创建的user实例就不止一个了
可以看到运行结果为俩id不一致
使用构造注入实例的时候配置如下,记得在类中写上构造函数
<bean id="userDaoImpl" class="dao.impl.UserDaoImpl">
<constructor-arg ref="user"></constructor-arg>
</bean>