Spring学习总结二——SpringIOC容器二

Posted 格物致知

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring学习总结二——SpringIOC容器二相关的知识,希望对你有一定的参考价值。

一:指定bean的依赖关系

例如examplebean对象依赖examplebean1对象,那么在创建examplebean对象之前就

需要先创建examplebean1对象。

1:创建Examplebean1类:

 1 /**
 2  * 
 3  */
 4 package com.hlcui.dao;
 5 
 6 /**
 7  * @author Administrator
 8  * 
 9  */
10 public class ExampleBean1 {
11     public ExampleBean1() {
12         System.out.println("实例化ExampleBean1...");
13     }
14 }

2:在spring容器配置文件中配置ExampleBean1对象,并且指定bean的依赖关系

depends-on="ExampleBean1"
1 <!-- 实例化ExampleBean对象 -->
2     <bean id="exampleBean" class="com.hlcui.dao.ExampleBean" lazy-init="true" 
3     init-method="init" destroy-method="destroy" scope="singleton" depends-on="ExampleBean1"></bean>
4 
5     <!-- 实例化ExampleBean1对象 -->
6     <bean id="ExampleBean1" class="com.hlcui.dao.ExampleBean1"
7         lazy-init="true"></bean>

3:运行测试方法:

1 @Test
2     /**测试bean的依赖关系*/
3     public void testNewExampleBean() {
4         ApplicationContext ac = getApplicationContext();
5         ExampleBean eb1 = ac.getBean("exampleBean", ExampleBean.class);
6         System.out.println(eb1);
7     }

通过结果可以看出先实例化依赖对象,再创建对象。

二:spring实现setter注入到jdbcDatasource数据库连接参数

1:导入jar包,在spring原有的支持包的基础上导入,oracle数据库的驱动包

2:创建JDBCDataSource类

 1 /**
 2  * 
 3  */
 4 package com.hlcui.dao;
 5 
 6 import java.sql.Connection;
 7 import java.sql.DriverManager;
 8 import java.sql.SQLException;
 9 
10 /**
11  * @author Administrator
12  * 
13  */
14 public class JDBCDataSource {
15 
16     private String driverClass;
17 
18     private String url;
19 
20     private String username;
21 
22     private String password;
23 
24     public String getDriverClass() {
25         return driverClass;
26     }
27 
28     public void setDriverClass(String driverClass) {
29         try {
30             Class.forName(driverClass); // 注册数据库驱动
31             this.driverClass = driverClass;
32         } catch (ClassNotFoundException e) {
33             e.printStackTrace();
34         }
35 
36     }
37 
38     public String getUrl() {
39         return url;
40     }
41 
42     public void setUrl(String url) {
43         this.url = url;
44     }
45 
46     public String getUsername() {
47         return username;
48     }
49 
50     public void setUsername(String username) {
51         this.username = username;
52     }
53 
54     public String getPassword() {
55         return password;
56     }
57 
58     public void setPassword(String password) {
59         this.password = password;
60     }
61 
62     // 获取数据库连接
63     public Connection getConn() throws SQLException {
64         return DriverManager.getConnection(url, username, password);
65     }
66 
67     // 关闭数据库连接
68     public void closeConn(Connection conn) {
69         if (null != conn) {
70             try {
71                 conn.close();
72             } catch (SQLException e) {
73                 e.printStackTrace();
74             }
75         }
76     }
77 }

3:配置bean对象

核心代码如下:

1 <!-- 配置jdbc数据源 -->
2     <bean id="jdbcDatasource" class="com.hlcui.dao.JDBCDataSource">
3         <property name="driverClass" value="oracle.jdbc.OracleDriver"></property>
4         <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"></property>
5         <property name="username" value="system"></property>
6         <property name="password" value="orcl"></property>
7     </bean>

4:测试方法以及运行结果

 1 @Test
 2     /**测试获取jdbc连接*/
 3     public void testJdbcConnection() {
 4         try {
 5             ApplicationContext ac = getApplicationContext();
 6             JDBCDataSource ds = ac.getBean("jdbcDatasource",
 7                     JDBCDataSource.class);
 8             System.out.println(ds.getConn());
 9         } catch (Exception e) {
10             e.printStackTrace();
11         }
12 
13     }

从运行结果可以看出,得到了jdbc连接对象。

三:spring实现构造器注入参数

1:创建业务实体类对象User

 1 /**
 2  * 
 3  */
 4 package com.hlcui.dto;
 5 
 6 /**
 7  * @author Administrator
 8  *
 9  */
10 public class User {
11     private int id;
12     private String name;
13     private String pwd;
14     private String phone;
15     public User(int id, String name, String pwd, String phone) {
16         super();
17         this.id = id;
18         this.name = name;
19         this.pwd = pwd;
20         this.phone = phone;
21     }
22     public User(String name, String pwd, String phone) {
23         super();
24         this.name = name;
25         this.pwd = pwd;
26         this.phone = phone;
27     }
28     public int getId() {
29         return id;
30     }
31     public void setId(int id) {
32         this.id = id;
33     }
34     public String getName() {
35         return name;
36     }
37     public void setName(String name) {
38         this.name = name;
39     }
40     public String getPwd() {
41         return pwd;
42     }
43     public void setPwd(String pwd) {
44         this.pwd = pwd;
45     }
46     public String getPhone() {
47         return phone;
48     }
49     public void setPhone(String phone) {
50         this.phone = phone;
51     }
52     @Override
53     public int hashCode() {
54         final int prime = 31;
55         int result = 1;
56         result = prime * result + id;
57         result = prime * result + ((name == null) ? 0 : name.hashCode());
58         result = prime * result + ((phone == null) ? 0 : phone.hashCode());
59         result = prime * result + ((pwd == null) ? 0 : pwd.hashCode());
60         return result;
61     }
62     @Override
63     public boolean equals(Object obj) {
64         if (this == obj)
65             return true;
66         if (obj == null)
67             return false;
68         if (getClass() != obj.getClass())
69             return false;
70         User other = (User) obj;
71         if (id != other.id)
72             return false;
73         if (name == null) {
74             if (other.name != null)
75                 return false;
76         } else if (!name.equals(other.name))
77             return false;
78         if (phone == null) {
79             if (other.phone != null)
80                 return false;
81         } else if (!phone.equals(other.phone))
82             return false;
83         if (pwd == null) {
84             if (other.pwd != null)
85                 return false;
86         } else if (!pwd.equals(other.pwd))
87             return false;
88         return true;
89     }
90     @Override
91     public String toString() {
92         return "User [id=" + id + ", name=" + name + ", phone=" + phone
93                 + ", pwd=" + pwd + "]";
94     }
95     
96 }
View Code

2:创建oracle的sql脚本,并且执行sql

 1 --创建表users
 2 Create Table Users(
 3 Id Number(6,2),
 4 Name Varchar2(30),
 5 Pwd  Varchar2(50),
 6 Phone Varchar2(50),
 7 Primary Key(Id),
 8 constraint name unique(name)
 9 );
10 
11 --创建序列
12 Create Sequence Seq_Users;
13 
14 --向表中插入数据
15 Insert Into Users (Id,Name,Pwd,Phone) Values(Seq_Users.Nextval,\'Tom\',\'123\',\'312123232\');
16 Insert Into Users (Id,Name,Pwd,Phone) Values(Seq_Users.Nextval,\'Jack\',\'456\',\'312123232\');
17 Insert Into Users (Id,Name,Pwd,Phone) Values(Seq_Users.Nextval,\'Lucy\',\'789\',\'312123232\');
18 commit;

3:创建UserDAO接口以及其实现类

 1 package com.hlcui.dao;
 2 
 3 import com.hlcui.dto.User;
 4 
 5 /**
 6  * @author Administrator
 7  *
 8  */
 9 public interface UserDAO {    
10     public User findByName(String name);
11 }
 1 /**
 2  * 
 3  */
 4 package com.hlcui.dao.impl;
 5 
 6 import java.sql.Connection;
 7 import java.sql.PreparedStatement;
 8 import java.sql.ResultSet;
 9 
10 import com.hlcui.dao.JDBCDataSource;
11 import com.hlcui.dao.UserDAO;
12 import com.hlcui.dto.User;
13 
14 /**
15  * @author Administrator
16  * 
17  */
18 public class OracleUserDAO implements UserDAO {
19 
20     private JDBCDataSource jdbcDataSource;
21 
22     public OracleUserDAO(JDBCDataSource jdbcDataSource) {
23         this.jdbcDataSource = jdbcDataSource;
24     }
25 
26     public User findByName(String name) {
27         Connection conn = null;
28         PreparedStatement prep = null;
29         ResultSet rs = null;
30         User user = null;
31         try {
32             conn = jdbcDataSource.getConn();
33             String sql = "select id,pwd,phone from users where name=?";
34             prep = conn.prepareStatement(sql);
35             prep.setString(1, name);
36             rs = prep.executeQuery();
37             while (rs.next()) {
38                 int id = rs.getInt("id");
39                 String pwd = rs.getString("pwd");
40                 String phone = rs.getString("phone");
41                 user = new User(id, name, pwd, phone);
42             }
43         } catch (Exception e) {
44             e.printStackTrace();
45         }
46         return user;
47     }
48 
49 }

注:这里使用preparedstatement进行预编译,可以有效的防止sql注入,select * from tableName  where username=\'\' and password = \'\' or 1=1,

这里的1=1是无论什么条件都会满足的,所以会登录进网站。经常使用ibatis框架的朋友对 where 1=1 and ... 比较熟悉,这里是为了防止后面的sql动态拼接

不满足条件造成 select * from tableName where 这种情况,这里区分一下。

4:在spring容器配置文件配置OracleUserDao的bean对象

 1 <!-- 配置jdbc数据源 -->
 2     <bean id="jdbcDatasource" class="com.hlcui.dao.JDBCDataSource">
 3         <property name="driverClass" value="oracle.jdbc.OracleDriver"></property>
 4         <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"></property>
 5         <property name="username" value="system"></property>
 6         <property name="password" value="orcl"></property>
 7     </bean>
 8     
 9     <!-- 配置userDao对象 -->
10     <bean id="userDao" class="com.hlcui.dao.impl.OracleUserDAO">
11         <constructor-arg index="0" ref="jdbcDatasource"/>
12     </bean>

constructor-arg元素代表构造器注入,index是参数的下表,0说明是第一个元素,如果有多个参数,可以使用如下格式:

1 <constructor-arg index="0">   
2         <value>first parameter</value>   
3     </constructor-arg>   
4     <constructor-arg index="1">   
5         <value>second parameter</value>   
6     </constructor-arg>   

5:测试读取数据库中的user对象

1 @Test
2     /**测试从oracle数据库中读取数据*/
3     public void testGetUser() {
4         ApplicationContext ac = getApplicationContext();
5         UserDAO dao = ac.getBean("userDao", OracleUserDAO.class);
6         User user = dao.findByName("Tom");
7         System.out.println(user);
8     }

成功读取User对象!

 

以上是关于Spring学习总结二——SpringIOC容器二的主要内容,如果未能解决你的问题,请参考以下文章

Spring学习总结五——SpringIOC容器五

Spring学习总结三——SpringIOC容器三

985研究生被小公司领导留了3年,java实验报告二

Spring点滴二:Spring Bean

Spring IoC容器4

MyEclipse Spring 学习总结一 Spring IOC容器