Spring框架xml显式配置bean

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>
发布了34 篇原创文章 · 获赞 54 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/Mart1nn/article/details/89016415