Spring核心之4 SpringIOC容器的实例化

1.SpringIOC容器-bean属性setter方法注入

1.1 概述

利用Spring的配置文件Beans002.xml 配置bean并且setter方法参数注入JDBCDataSource的链接参数,

这样Spring在创建JDBCDataSource对象以后会自动化的调用setter方法注入数据库连接参数

1.2 beans002.xml配置文件

<bean id="dataSource" class="com.gaoxinfu.demo.spring.example.dao.JDBCDataSource">
    <property name="driver" value="oracle.jdbc.OracleDriver"></property>
    <property name="url" value="dbc:oracle:thin:@localhost:1521:xe"></property>
    <property name="user" value="test001"></property>
    <property name="password" value="test001"></property>
</bean>

1.3 代码

import java.io.Serializable;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * 
 * @Description:JDBCDataSource
 * @Author:gaoxinfu
 * @Time:2018年2月12日 下午4:36:03
 */
@SuppressWarnings("serial")
public class JDBCDataSource implements Serializable{

private String driver;
private String url;

private String user;

private String password;

public String getDriver() {
	return driver;
}

public void setDriver(String driver) {
	try {
		//注册数据库驱动
		Class.forName(driver);
		this.driver = driver;
	} catch (ClassNotFoundException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}

public String getUrl() {
	return url;
}

public void setUrl(String url) {
	this.url = url;
}

public String getUser() {
	return user;
}

public void setUser(String user) {
	this.user = user;
}

public String getPassword() {
	return password;
}

public void setPassword(String password) {
	this.password = password;
}

public Connection getConnection() throws SQLException {
	Connection connection=DriverManager.getConnection(url, user, password);
	return connection;
}
public void close(Connection connection) {
	if (connection!=null) {
		try {
			connection.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}
}

1.4 测试


import java.sql.Connection;
import java.sql.SQLException;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.gaoxinfu.demo.base.Base;

public class JDBCDataSourceTest extends Base{

	@Test
	public void testJDBCDataSourceBean() throws SQLException {
		String beanConfig="Beans002.xml";
		ApplicationContext context =new ClassPathXmlApplicationContext(beanConfig);
		JDBCDataSource jDBCDataSource= context.getBean("dataSource",JDBCDataSource.class);
		Connection connection=jDBCDataSource.getConnection();
		logger.info("JDBCDataSourceTest-testJDBCDataSourceBean:connection="+connection);
	}
}

2.SpringIOC容器-利用构造器参数实现依赖注入

2.1 概述

通过构造方法去注入

2.2 bean002.xml配置

<!-- 调用OracleUserDAO的构造方法 public OracleUserDAO(JDBCDataSource dataSource)  -->
<bean id="userDAO" class="com.gaoxinfu.demo.spring.example.dao.OracleUserDAO">
	<!-- 利用构造器参数注入bean属性 -->
	<constructor-arg index="0" ref="dataSource"></constructor-arg>
</bean>

2.3 代码

2.3.1 UserDAO

package com.gaoxinfu.demo.spring.example.dao;

import com.gaoxinfu.demo.spring.example.bean.User;

public interface UserDAO {

	public User findByName(String name);
}

2.3.2 OracleUserDAO

package com.gaoxinfu.demo.spring.example.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.gaoxinfu.demo.base.Base;
import com.gaoxinfu.demo.spring.example.bean.User;

public class OracleUserDAO extends Base implements UserDAO {

	private JDBCDataSource dataSource;
	
	/**
	 *  构造方法
	 * @param dataSource
	 */
	public OracleUserDAO(JDBCDataSource dataSource) {
		super();
		this.dataSource = dataSource;
	}

	@Override
	public User findByName(String name) {
		logger.info("利用JDBC技术查找User信息");
//		String sql="Select * From Users Where Name=?";
		String sql="Select id,name,pwd,phone From Users Where Name=?";
		Connection connection=null;
		try {
			connection=dataSource.getConnection();
			PreparedStatement preparedStatement=connection.prepareStatement(sql);
			preparedStatement.setString(1, name);
			ResultSet resultSet=preparedStatement.executeQuery();
			User user=null;
			while (resultSet.next()) {
				user=new User();
				user.setId(resultSet.getInt("id"));
				user.setName(resultSet.getString("name"));
				user.setPhone(resultSet.getString("phone"));
				user.setPwd(resultSet.getString("pwd"));
			}
			resultSet.close();
			connection.close();
			return user;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			logger.info("OracleUserDAO-findByName出现异常:"+e);
			throw new RuntimeException(e);
		}finally {
			dataSource.close(connection);
		}
	}
}

2.4 测试

package com.gaoxinfu.demo.spring.example.dao;

import java.sql.SQLException;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.gaoxinfu.demo.base.Base;

public class OracleUserDAOTest extends Base{

	@SuppressWarnings("resource")
	@Test
	public void testFindByName() throws SQLException {
		String beanConfig="Beans002.xml";
		ApplicationContext context =new ClassPathXmlApplicationContext(beanConfig);
		UserDAO userDAO=context.getBean("userDAO",UserDAO.class);
		logger.info(userDAO.findByName("Tom"));
	}
}

3.SpringIOC容器-利用Spring的自动装配功能实现自动属性注入

3.1概述

3.1.1 当前自动注入类型有一下几种

1.no 禁用自动装配,默认值

2.byName 根据属性名自动装配,此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配;

3.byType 如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配

4.constructor 与byType的方式类似,不同之处在于它应用于构造参数

5.autodetect 通过bean类来决定使用constructor还是byType方法自动装配,如果发现默认的构造器,那么将使用byType方式

下面的是byType的一个案例

3.2 bean002.xml配置

 <!-- 自动装配功能 -->
    <bean id="userService" class="com.gaoxinfu.demo.spring.example.service.UserService" autowire="byType"></bean>

3.3 代码

package com.gaoxinfu.demo.spring.example.service;

import com.gaoxinfu.demo.spring.example.bean.User;
import com.gaoxinfu.demo.spring.example.dao.UserDAO;

public class UserService {

	private UserDAO userDAO;
	
	public UserDAO getUserDAO() {
		return userDAO;
	}

	public void setUserDAO(UserDAO userDAO) {
		this.userDAO = userDAO;
	}

	/**
	 * 
	 * @Title: login   
	 * @Description: 用户登录功能
	 * @param name
	 * @param pwd
	 * @return      
	 * @return: User      
	 * @throws   
	 * @Exception:
	 * @Author: gaoxinfu
	 * @Time:2018年2月12日 下午4:50:22
	 */
	public User login(String name,String pwd) {
		User user=userDAO.findByName(name);
		if (user!=null&&pwd.equals(user.getPwd())) {
			return user;
		}
		return null;
	}
}


3.4 测试

package com.gaoxinfu.demo.spring.example.service;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.gaoxinfu.demo.base.Base;

public class UserServiceTest extends Base{

	@SuppressWarnings("resource")
	@Test
	public void testLogin() {
		String beanConfig="Beans002.xml";
		ApplicationContext context =new ClassPathXmlApplicationContext(beanConfig);
		UserService UserService=context.getBean("userService",UserService.class);
		logger.info(UserService.login("Tom", "123"));
	}

}

猜你喜欢

转载自blog.csdn.net/u014636209/article/details/83047844