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"));
}
}