Spring从菜鸟到高手(三)依赖注入

来源:互联网 发布:女高中生知乎 编辑:程序博客网 时间:2024/05/16 11:42
Spring中有一个技术叫做依赖注入,而依赖注入又分为【构造函数】注入和【Set】注入,前面我们都看到了依赖注入的好处和方便之处,大家也许要问【Set】注入和【构造函数】注入有什么分别呢?
今天我将一个小例子展示给大家这个例子使用了Spring【构造函数】依赖注入方式,究竟【构造函数】【Set】这两种方法哪种好?要看用在什么地方,如果我们的一个属性要随着类的实例保持不变我们就选择使用构造方法注入,如果我们的一个属性变量在这个类的实例中会有可能改变,那么我们就选择Set注入。


这个例子主要演示的是通过构造函数来实现注入,因为我们这个类的功能是读取Properties文件的信息,以备后面的模块连接数据库,所以连接数据库的信息是不能改变的,将它通过构造函数注入是一个很好的  这样做的好处是 好我们现在就开始

这个类需要导入这几个包
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;


大家注意到这个类的构造方法有一个类型为String的参数负责传递进来一个文件名(相对路径),通过Class类的getResourceAsStream方法读取并且返回一个InputStream类型的对象,
 InputStreamgetResourceAsStream(String name)
          查找具有给定名称的资源。
 
然后java.util.Properties类的load方法将他读取进属性列表 voidload(InputStream inStream)
          从输入流中读取属性列表(键和元素对)。


public class PropertiesConfig {

    private Properties properties = null;
   
    public PropertiesConfig(StringfileUrl)throws IOException
    {
  
       

        InputStream ips = this.getClass().getResourceAsStream(fileUrl);//通过路径字符串得到一个流
        if(ips == null)//判断路径的正确性,如果错误直接抛出异常,不允许向下进行
        {
             throw new IOException("The fileUrl is nullity !");
        }
        this.properties = new Properties();
        properties.load(ips);//将得到的流读取进属性列表
    }
   
    public Properties getProperties() {
        return properties;
    }
    public void setProperties(Properties properties) {
        this.properties = properties;
    }
   
   
}
 
XML配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "[url]http://www.springframework.org/dtd/spring-beans.dtd[/url]">
<beans>
 <bean id="popertiesConfig" class="cn.incast.PropertiesConfig">
  <constructor-arg>
   <value>db.properties</value>         <!--通过构造函数来注入-->
  </constructor-arg>
 </bean>
</beans>
db.properties文件的内容
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost/itcast
jdbc.user=root
jdba.pass=
可是如果我们的【构造函数】有多个参数我们该怎么办呢?
我们可以使用<constructor-arg>的一个属性【index】

  <constructor-arg  index="1">
   <value>db.properties</value>         <!--通过构造函数来注入-->
  </constructor-arg>
还可以使用<constructor-arg>的另一个属性【type】
  <constructor-arg  type="java.lang.String">
   <value>db.properties</value>         <!--通过构造函数来注入-->
  </constructor-arg>
例子1、
<bean id="popertiesConfig" class="cn.incast.PropertiesConfig">
  <constructor-arg index="1">
   <value>db.properties</value>         <!--构造函数参数1-->
  </constructor-arg>
  <constructor-arg index="1">
   <value>db.properties</value>         <!--构造函数参数2-->
  </constructor-arg>

 </bean>
例子2、

 
<bean id="popertiesConfig" class="cn.incast.PropertiesConfig">
  <constructor-arg itypr="java.lang.String">
   <value>db.properties</value>         <!--构造函数参数1-->
  </constructor-arg>
<!--遇到这种两个参数都是一个类型,并且无法分辨究竟哪个是第一个参数哪个是第二个参数就需要使用index了-->
  <constructor-arg type="java.lang.String">
   <value>db.properties</value>         <!--构造函数参数2-->
  </constructor-arg>

 </bean>
----------------------------------------------
以下是通过Set注入的例子很简单,相信大家,一看就懂
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import java.util.logging.Logger;
 
/*
 * 用于通过propertiesConfig文件建立连接
 *
 */
public class ConnectionConfig {
 private PropertiesConfig propertiesConfig = null;
 private Logger log = Logger.getLogger("cn.incast.ConnectionConfig");
 
 public Connection foundConnection()throws IOException,ClassNotFoundException,SQLException
 {
  
  Properties propts = null;
  Connection cn = null;
  
  propts = propertiesConfig.getProperties();
  Class.forName(propts.getProperty("jdbc.driver"));
  cn = DriverManager.getConnection(
     propts.getProperty("jdbc.url"),
     propts.getProperty("jdbc.user"),
     propts.getProperty("jdbc.pass"));
  return cn;  
 }
 
 public void closeConnection(Connection cn)
 {
  if(cn !=null)
  {
   try
   {
    cn.close();
    cn = null;
   }
   catch (SQLException e)
   {log.warning("Connection call on error !");}
  }
 }
 public void closeStatement(Statement stmt)
 {
  if(stmt !=null)
  {
   try
   {
    stmt.close();
    stmt = null;
   }
   catch (SQLException e)
   {log.warning("Statement call on error !");}
  }
 }public void closeResultSet(ResultSet rs)
 {
  if(rs !=null)
  {
   try
   {
    rs.close();
    rs = null;
   }
   catch (SQLException e)
   {log.warning("ResultSet call on error !");}
  }
 }
 public PropertiesConfig getPropertiesConfig() {
  return propertiesConfig;
 }
 public void setPropertiesConfig(PropertiesConfig propertiesConfig) {
  this.propertiesConfig = propertiesConfig;
 }
 
}
这个类是为我下一篇文章作铺垫的,我的下一篇文章是介绍Spring与数据库连接的一些小的心得,主要使用Spring连接数据库其中用到了JaKarta的BasicDtatSource数据源对象、Sql注入攻击以及JDBC调用MySql的存储过程和方法,敬请期待。

本文出自 “绝缘材料” 博客,请务必保留此出处http://tonyaction.blog.51cto.com/227462/42041

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 做了飞机耳朵疼怎么办 玩完海盗船想吐怎么办 8岁儿童想吐头晕怎么办 飞机打多了肾虚怎么办 18岁牙齿长歪了怎么办 婴儿牙齿长歪了怎么办 小孩有强迫症怎么办呢 四岁儿童强迫症怎么办 我有洁癖强迫症怎么办 用死威胁不分手怎么办 狗的腿关节断了怎么办 狗狗的腿断了怎么办 扁桃体发炎长白色的东西怎么办 十几年旧伤复发怎么办 被撞当天没报警怎么办 90后欠30万债务怎么办 赌博输了钱后悔怎么办 借赌博输了80万怎么办 赌博输了50万怎么办 手机赌博输了钱怎么办 内存卡是扩容卡怎么办 坐了过山车想吐怎么办 坐完摇椅想吐怎么办 玩完过山车想吐怎么办 做了过山车想吐怎么办 坐车后恶心想吐怎么办 太胖了想减肥怎么办 被集资诈骗的人怎么办 教了作业没写怎么办 移动4g网速慢怎么办 小孩装病不去上学怎么办 卖衣服顾客嫌贵怎么办 当顾客说再看看怎么办 读完高中没考上大学怎么办 手抖不会写字了怎么办 字认识写不出来怎么办 八四把衣服发黄怎么办 孩孑在学校被打怎么办 在学校有人打我怎么办 孩子在学校不爱说话怎么办 孩子上幼儿园不和小朋友玩怎么办