(精简)Spring框架的IoC(替代工厂类实现方法)和AOP(定义规则,约定大于配置)

Spring的核心框架主要包含两个技术,分别用来处理工厂类,以及事务处理和连接管理的。

两大核心概念

1)  IoC:控制反转,在现在的开发中,如果想建立对象并设置属性,是需要先new对象,再通过setter或构造方法设置属性。而使用Spring的IoC后,则是先通过配置声明属性的值或关系,再通过Spring框架建立对象,建立好的对象中就自动设置好了配置的属性。此功能可以替代工厂类。在IoC 中还提出了DI(依赖注入),表示将一个Spring中配置好的类,设置到另一个Spring配置的类中,作为属性使用。

2)  AOP:面向切面编程,特点是在不修改原有代码的基础上,为项目加入一个新的功能。Filter过滤器就是一个典型的AOP设计。Spring中则是使用Interceptor拦截器来实现动态代理设计的功能。在这里主要实现的就是连接的关闭,以及事务的提交和回滚操作,使用这个AOP的功能后,Service的实现类中就不再需要自己编写try…catch…finallly等操作,由Spring自动完成。


Spring的主要组成部件:

1)  SpringCore核心组件:实现的是IoC功能。

2)  SpringAOP组件:实现的是AOP功能

3)  SpringPersistence API:Spring针对持久化操作(JDBC)的支持。

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

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

6)  SpringMVC:Spring提供的一个前端框架,可以替代Struts2,完成前台的操作。

7)  SpringTest:针对JUnit的支持。

8)  SpringAnnotation:在Spring 2.5版加入,在3.0完善的,可以替代XML形式的配置(推荐使用)

一、Spring的IoC功能(掌握)

这里先使用SpringIoC实现打印HelloWorld的功能, 来看其替代工厂实现的方法。

建立项目,并加入Spring支持。加入Spring 的核心jar。


建立好核心配置文件。

(精简)Spring框架的IoC(替代工厂类实现方法)和AOP(定义规则,约定大于配置)_第1张图片

通过接口实现类的形式,编写一个简单的打印Hello World的功能。

[java] view plain copy
  1. public interface IHelloDAO {  
  2.     public String sayHello(String name);  
  3. }  
[java] view plain copy
  1. public class HelloDAOImpl implements IHelloDAO {  
  2.     public String sayHello(String name) {  
  3.         return "Hell World " + name;  
  4.     }  
  5. }  

将工厂部分取消,改为通过Spring配置来完成对象的建立。这里在applicationcontext.xml中添加

[java] view plain copy
  1. <span style="color:#cc0000;"><bean id="helloDAOImpl" class="org.liky.dao.impl.HelloDAOImpl"></bean></span>  

声明一个<bean>,对应一个java的类,这里将HelloDAOImpl声明到Spring中。

同时,id作为这个类的唯一标识,不允许重复,推荐以类名首字母小写,作为这个名称。

测试建立对象

[java] view plain copy
  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         // 建立读取配置文件的核心对象  
  4.         ApplicationContext ctx = new ClassPathXmlApplicationContext(  
  5.                 "applicationContext.xml");  
  6.   
  7.         // 建立对象,根据id来建立对象  
  8.         <span style="color:#cc0000;">IHelloDAO dao = (IHelloDAO) ctx.getBean("helloDAOImpl")</span>;  
  9.         System.out.println(dao.sayHello("test"));  
  10.     }  
  11. }  
注:这里建立对象 IHelloDAO dao =DAOFactory.getDAOImplInstance().XXX来建立了;

这里并没有体现出Spring的优势,当对象中包含属性时,才能看出Spring建立对象的好处。


这里使用Spring实现数据库连接类,来看Spring配置的优点。

[java] view plain copy
  1. public class DataBaseConnection {  
  2.     private String dbdriver;  
  3.     private String dburl;  
  4.     private String username;  
  5.     private String password;  
  6.   
  7.     private Connection conn;  
  8.   
  9.     public Connection getConnection() {  
  10.         try {  
  11.             if (conn == null || conn.isClosed()) {  
  12.                 Class.forName(dbdriver);  
  13.                 conn = DriverManager.getConnection(dburl, username, password);  
  14.             }  
  15.         } catch (Exception e) {  
  16.             e.printStackTrace();  
  17.         }  
  18.         return conn;  
  19.     }     
  20.     public void close() {  
  21.         if (conn != null) {  
  22.             try {  
  23.                 conn.close();  
  24.             } catch (SQLException e) {  
  25.                 e.printStackTrace();  
  26.             }  
  27.         }  
  28.     }  
  29.   
  30.     public void setDbdriver(String dbdriver) {  
  31.         this.dbdriver = dbdriver;  
  32.     }  
  33.   
  34.     public void setDburl(String dburl) {  
  35.         this.dburl = dburl;  
  36.     }  
  37.   
  38.     public void setUsername(String username) {  
  39.         this.username = username;  
  40.     }  
  41.   
  42.     public void setPassword(String password) {  
  43.         this.password = password;  
  44.     }  
  45. }  

这个类中的数据库连接属性,都通过Spring配置来加入。

修改Spring配置文件。

[html] view plain copy
  1. <span style="white-space:pre">  </span><bean <span style="color:#cc0000;">id="dataBaseConnection"</span> class="org.liky.dbc.DataBaseConnection">  
  2.         <property name="dbdriver" value="oracle.jdbc.driver.OracleDriver"></property>  
  3.         <property name="dburl" value="jdbc:oracle:thin:@localhost:1521:ORCL"></property>  
  4.         <property name="username" value="SUNXUN"></property>  
  5.         <property name="password" value="123"></property>  
  6.     </bean>  

通过SPring建立出的dbc对象,就包含了连接的各种属性,也就可以直接建立出数据库连接了。

[java] view plain copy
  1. public class Test {  
  2.     public static void main(String[] args) {  
  3.         // 建立读取配置文件的核心对象  
  4.         ApplicationContext ctx = new ClassPathXmlApplicationContext(  
  5.                 "applicationContext.xml");  
  6.   
  7.         DataBaseConnection dbc = (DataBaseConnection) ctx  
  8.                 .getBean("dataBaseConnection");  
  9.   
  10.         System.out.println(dbc.getConnection());  
  11.     }  
  12. }  

这里只能体现出后期维护中,这种配置的好处。

除此以外,如果在DAOImpl中想使用数据库连接,也可以通过Spring自动注入完成,这里使用的功能就是依赖注入(很形象)。

[java] view plain copy
  1. public class HelloDAOImpl implements IHelloDAO {  
  2.     private DataBaseConnection dbc;  
  3.   
  4.     public String sayHello(String name) {  
  5.         System.out.println(dbc.getConnection());  
  6.         return "Hell World " + name;  
  7.     }  
  8.   
  9.     public void setDbc(DataBaseConnection dbc) {  
  10.         this.dbc = dbc;  
  11.     }  
  12. }  

修改配置文件(需要在id=helloDAOImpl的注入id=dataBaseConnection的对象)。

[java] view plain copy
  1. <span style="white-space:pre">  </span><bean id="helloDAOImpl" class="org.liky.dao.impl.HelloDAOImpl">  
  2.         <property name="dbc">  
  3.             <ref bean="dataBaseConnection"/>  
  4.         </property>  
  5.     </bean>  

通过测试,可以发现,dbc使用的是单例设计模式。

也就是说,Spring中所有的<bean>默认都是单例设计。

如果不想使用单例设计,可以通过设置scope属性来处理。

[java] view plain copy
  1. <bean id="dataBaseConnection" <span style="color:#cc0000;">scope="prototype"</span> class="org.liky.dbc.DataBaseConnection">  
  2.         <property name="dbdriver" value="oracle.jdbc.driver.OracleDriver"></property>  
  3.         <property name="dburl" value="jdbc:oracle:thin:@localhost:1521:ORCL"></property>  
  4.         <property name="username" value="SUNXUN"></property>  
  5.         <property name="password" value="123"></property>  
  6.     </bean>  

除了这种基本配置以外,Spring还支持加入一些集合配置,可以为集合设置默认值。

例如:

1)  List

[java] view plain copy
  1. <span style="white-space:pre">      </span><property name="all">  
  2.             <list>  
  3.                 <value>zhangsan</value>  
  4.                 <value>123</value>  
  5.                 <ref bean="dataBaseConnection" />  
  6.                 <value>zhangsan</value>  
  7.             </list>  
  8.         </property>  

2)  Set

[java] view plain copy
  1. <span style="white-space:pre">      </span><property name="all">  
  2.             <set>  
  3.                 <value>zhangsan</value>  
  4.                 <value>123</value>  
  5.                 <ref bean="dataBaseConnection" />  
  6.                 <value>zhangsan</value>  
  7.             </set>  
  8.         </property>  

3)  Map

[java] view plain copy
  1. <span style="white-space:pre">      </span><property name="all">  
  2.             <map>  
  3.                 <entry key="zhangsan">  
  4.                     <value>123</value>  
  5.                 </entry>  
  6.                 <entry key-ref="dataBaseConnection">  
  7.                     <ref bean="dataBaseConnection"/>  
  8.                 </entry>  
  9.             </map>  
  10.         </property>  

4)  Properties

[java] view plain copy
  1. <span style="white-space:pre">      </span><property name="all">  
  2.             <props>  
  3.                 <prop key="zhangsan">123</prop>  
  4.                 <prop key="lisi">abc</prop>  
  5.             </props>  
  6.         </property>  

二、Spring的AOP功能(了解)

AOP:面向切面编程,特点是在不修改原有代码的基础上,为项目加入一个新的功能。Filter过滤器就是一个典型的AOP设计。

AOP使用的原理,实际上是JavaSE里反射类库中的Proxy类。

但在Spring中,由于Proxy类的代码比较复杂,通,因此对其进行了封装过MethodInterceptor的接口来实现代理功能。

这里先编写一个代理规则类。

注意,项目支持中,需要多加入一个AOP的支持库。


同时,修改ServiceImpl类,简化代码。

[java] view plain copy
  1. public class HelloServiceImpl implements IHelloService {  
  2.     private IHelloDAO hellodao;  
  3.     private DataBaseConnection dbc;  
  4.   
  5.     public String say(String name) {  
  6.         return hellodao.sayHello(name);  
  7.     }  

这里的try…catch…finally的代码,会单独编写到规则类中完成(规则)。

[java] view plain copy
  1. public class ConnectionInterceptor implements MethodInterceptor {  
  2.     private DataBaseConnection dbc;  
  3.   
  4.     // 在此方法中,编写代码规则.  
  5.     public Object invoke(MethodInvocation mi) throws Throwable {  
  6.         Object obj = null;  
  7.         try {  
  8.             // 动态调用该调用的SErvice操作.  
  9.             obj = mi.proceed();  
  10.         } catch (Exception e) {  
  11.             e.printStackTrace();  
  12.         } finally {  
  13.             System.out.println("拦截器中关闭连接....");  
  14.             dbc.close();  
  15.         }  
  16.         return obj;  
  17.     }  
  18.   
  19.     public void setDbc(DataBaseConnection dbc) {  
  20.         this.dbc = dbc;  
  21.     }  
  22. }  

配置这个类所要应用的规则,即哪些类需要使用这套规则来关闭连接。(约定大于配置)

[java] view plain copy
  1. <bean id="connectionInterceptor" class="org.liky.interceptor.ConnectionInterceptor">  
  2.         <property name="dbc">  
  3.             <ref bean="dataBaseConnection" />  
  4.         </property>  
  5.     </bean>  
  6.     <!--   
  7.         配置应用规则  
  8.     -->  
  9.     <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">  
  10.         <!--   
  11.             <span style="color:#cc0000;">哪些<bean>需要使用上面的拦截器规则  
  12.             只要保证命名规范,这里的配置就是固定的.</span>  
  13.         -->  
  14.         <property name="beanNames">  
  15.             <list>  
  16.                 <value>*ServiceImpl</value>  
  17.             </list>  
  18.         </property>     
  19.         <!--   
  20.             所使用的拦截器  
  21.         -->  
  22.         <property name="interceptorNames">  
  23.             <list>  
  24.                 <value>connectionInterceptor</value>  
  25.             </list>  
  26.         </property>  
  27.     </bean>  
这篇博文这是简单介绍下Spring框架的IoC控制反转(替代工厂类实现方法)和AOP面向切面编程(定义规则,约定大于配置);后面博文会再详细说明它分别与JDBC、Struts联合开发的一些程序。

你可能感兴趣的:((精简)Spring框架的IoC(替代工厂类实现方法)和AOP(定义规则,约定大于配置))