您的位置:首页 > 编程语言 > Java开发

Spring框架的IoC和AOP

2014-03-20 13:34 447 查看
Spring框架主要提供了两大核心概念IoC和AOP。

1)  IoC:控制翻转,正常建立对象一般是先实例化对象,然后再为对象设置属性,Spring则是先通过配置文件来声明一个类以及类中间的属性信息,再使用Spring提供的操作读取配置文件,建立出包含这些属性的对象。此功能主要替代工厂类。

2)  AOP:面向切面编程,在不修改原有代码的基础上,为项目加入或删除功能。在实际开发中,Spring的AOP主要实现的是动态代理功能,通过使用这个功能,可以替代Service中的连接关闭和事务处理操作,由Spring统一完成。

 

Spring的主要组成部分:

1)  SpringCore:Spring核心库,包含IoC功能

2)  SpringAOP:包含Spring的AOP功能。

3)  SpringPersistence API:Spring针对数据库操作的支持,可以使Spring+ JDBC完成开发。

4)  SpringORMapping:Spring针对各种ORMapping框架的支持,可以结合Hibernate,iBATIS,JDO

5)  SpringWeb:Spring针对Web端框架的支持,可以结合Struts2,WebWork

6)  SpringMVC:用来替代Struts2的框架

7)  SpringAnnotation:可以简化XML配置,要求版本必须在2.5以上,3.0开始完善。

Spring的IoC配置:

在项目中先加入Spring支持:

next:

这里使用接口和实现类的模式,完成打印HelloWorld的功能。

public
interface
IHelloDAO {
 
    public String sayHello(String name);
 
}

public
class
HelloDAOImpl implements IHelloDAO {
 
    public String sayHello(String name) {
       return
"Hello World " + name;
    }
 
}
在Spring中编写配置,将实现类helloDAOImpl配置到Spring管理下。

<bean
id="helloDAOImpl"
class="org.liky.dao.impl.HelloDAOImpl"></bean>
 

编写测试类,进行测试

public
class
Test {
 
    public
static void
main(String[] args) {
       // 建立读取Spring配置文件的核心类
       ApplicationContext ctx = new ClassPathXmlApplicationContext(
              "applicationContext.xml");
 
       // 取得实现类对象
       IHelloDAO dao = (IHelloDAO) ctx.getBean("helloDAOImpl");
 
       System.out.println(dao.sayHello("test"));
 
    }
 
}

 

除了这种普通的建立对象的方式以外,SPring还支持动态设置属性的功能。

例如:

建立一个数据库连接类。

public
class
DataBaseConnection {
 
    private String
dbdriver;
    private String
dburl;
    private String
username;
    private String
password;
    private Connection
conn;
 
    public Connection getConnection() {
       try {
           if (conn ==
null ||
conn.isClosed()) {
              Class.forName(dbdriver);
              conn = DriverManager.getConnection(dburl,
username, password);
           }
        } catch (Exception e) {
           e.printStackTrace();
       }
       return
conn;
    }
 
    public
void
close() {
       if (conn !=
null) {
           try {
              conn.close();
           } catch (Exception e) {
              e.printStackTrace();
           }
       }
    }
 
    public
void
setDbdriver(String dbdriver) {
       this.dbdriver = dbdriver;
    }
 
    public
void
setDburl(String dburl) {
       this.dburl = dburl;
    }
 
    public
void
setUsername(String username) {
       this.username = username;
    }
 
    public
void
setPassword(String password) {
       this.password = password;
    }
 
}

注意,其中属性要生成setter方法,以便配置文件可以动态设置属性。
修改配置文件,加入这个数据库连接类的配置。

    <bean
id="dataBaseConnection"
class="org.liky.dbc.DataBaseConnection">
       <property
name="dbdriver"
value="oracle.jdbc.driver.OracleDriver"></property>
       <property
name="dburl"
value="jdbc:oracle:thin:@localhost:1521:ORCL"></property>
       <property
name="username"
value="SUNXUN"></property>
       <property
name="password"
value="123"></property>
    </bean>

 

除了这种设置普通属性的功能外,Spring还可以直接将一个设置好的<bean>注入到另一个<bean>中,称为依赖注入(DI)。

public
class
HelloDAOImpl implements IHelloDAO {
 
    private DataBaseConnection
dbc;
 
    public String sayHello(String name) {
       System.out.println(dbc.getConnection());
       return
"Hello World " + name;
    }
 
    public
void
setDbc(DataBaseConnection dbc) {
       this.dbc = dbc;
    }
 
}

    <bean
id="helloDAOImpl"
class="org.liky.dao.impl.HelloDAOImpl">
       <property
name="dbc"
>
           <ref
bean="dataBaseConnection"/>
       </property>
    </bean>
 
同样的,这种配置还可以应用在Service的操作中。

public
class
HelloServiceImpl implements IHelloService {
 
    private IHelloDAO
hellodao;
 
    private DataBaseConnection
dbc;
 
    public String say(String name) {
       String result = null;
       try {
           result = hellodao.sayHello(name);
       } catch (Exception e) {
           e.printStackTrace();
       } finally {
           dbc.close();
       }
       return result;
    }
 
    public
void
setHellodao(IHelloDAO hellodao) {
       this.hellodao = hellodao;
    }
 
    public
void
setDbc(DataBaseConnection dbc) {
       this.dbc = dbc;
    }
}

配置

    <bean
id="helloServiceImpl"
class="org.liky.service.impl.HelloServiceImpl">
       <property
name="hellodao">
           <ref
bean="helloDAOImpl"
/>
       </property>
       <property
name="dbc">
           <ref
bean="dataBaseConnection"
/>
       </property>
    </bean>

 

经过测试可以发现,Spring中建立的<bean>默认都是单例设计模式,只建立了一个对象。

如果不想使用单例设计,可以通过配置来完成修改(此功能在Spring + Struts2开发时会用到)

    <bean
id="dataBaseConnection"
scope="prototype"
       class="org.liky.dbc.DataBaseConnection">
       <property
name="dbdriver"
value="oracle.jdbc.driver.OracleDriver"></property>
       <property
name="dburl"
value="jdbc:oracle:thin:@localhost:1521:ORCL"></property>
       <property
name="username"
value="SUNXUN"></property>
       <property
name="password"
value="123"></property>
    </bean>
 

 

同时,Spring的注入还支持对集合的配置:

 

1)  List

       <property
name="all">
           <list>
              <value>zhangsan</value>
              <value>234</value>
              <ref
bean="dataBaseConnection"/>
              <value>zhangsan</value>
           </list>
       </property>

2)  Set

       <property
name="all">
           <set>
              <value>zhangsan</value>
              <value>234</value>
              <ref
bean="dataBaseConnection"/>
              <value>zhangsan</value>
           </set>
       </property>

3)  Map

       <property
name="all">
           <map>
              <entry
key="zhangsan">
                  <value>123</value>
              </entry>
              <entry
key-ref="dataBaseConnection">
                  <ref
bean="dataBaseConnection"
/>
              </entry>
           </map>
       </property>

4)  Properties

       <property
name="all">
           <props>
              <prop
key="zhangsan">123</prop>
              <prop
key="lisi">123</prop>
              <prop
key="wangwu">123</prop>
           </props>
       </property>

 

 

还有一些配置,不推荐使用,但要知道。

1)  autowire

<bean
id="helloDAOImpl"
class="org.liky.dao.impl.HelloDAOImpl"
autowire="byType">  
由于代码不容易维护,因此开发中不推荐使用
2)  构造方法注入。

    <bean
id="helloDAOImpl"
class="org.liky.dao.impl.HelloDAOImpl">
       <constructor-arg index="0">
           <ref bean="dataBaseConnection"/>
       </constructor-arg>

没有setter方法方便,还需要单独建立无参构造,而且通过索引不容易查看,所以不推荐使用。
Spring的AOP配置:

Spring的AOP功能主要是替代Service中的连接关闭和事务处理,使用AOP功能,需要用到MethodInterceptor接口。

其原理是通过Java反射类库中的Proxy来实现。

在项目中需要加入针对AOP的支:

加入支持后,将IoC中的代码拷贝过来,修改Service的实现类,不再需要try…catch…finally的代码,将其删除简化:

    public String say(String name) {
       return
hellodao.sayHello(name);
    }

建立一个interceptor拦截器类,完成try…catch…finally的操作:

public
class
ConnectionInterceptor implements MethodInterceptor {
 
    private DataBaseConnection
dbc;
 
    public
Object invoke(MethodInvocation arg0) throws Throwable {
       Object obj = null;
       try {
           obj = arg0.proceed();
       } catch (Exception e) {
           e.printStackTrace();
       } finally {
           System.out.println("关闭连接");
           dbc.close();
       }
       return obj;
    }
 
    public
void
setDbc(DataBaseConnection dbc) {
       this.dbc = dbc;
    }
 
}

配置

    <!--
       Spring提供了一个类,通过该类来完成拦截器要针对哪个或哪些类起作用的配置.
    -->
    <bean
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
       <property
name="beanNames">
           <list>
              <value>*ServiceImpl</value>
           </list>
       </property>
       <property
name="interceptorNames">
           <list>
              <value>connectionInterceptor</value>
           </list>
       </property>
    </bean>

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate ioc aop