首页 > 代码库 > Spring浅探

Spring浅探

  热度最大的框架,它也称为业务层框架。Spring这个框架的诞生,给程序员揭示了两个主要的思想:Ioc,Aop;

  最近的网页架构可以分为这样。

  技术分享

  传统结构中,每个层都得new出依赖层的类进行一些本层操作,而Spring的出现使得这些层与层的依赖关系变得不那么紧致。所有的需要新建的类都由Spring的bean工厂提供。控制权限被反转了,所以称为控制反转(Inversion of Control)。

  而在业务层有很多模块,为了使每个模块更专注于自己的工作,并且不用考虑模块间的耦合,Spring提出了Aop的思想。类与类间的关系除了继承多态,没有定义平行的关系,而Aop弥补了类间关系,使得切面实现业务又丰富又简单。

技术分享

  Ioc范例

package IoC_AOP;public interface Person {    public void speak();}
package IoC_AOP;public class Chinese implements Person{    private String name;    private String age;    public Chinese(){            }    public Chinese(String name, String age) {        super();        this.name = name;        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getAge() {        return age;    }    public void setAge(String age) {        this.age = age;    }    @Override    public void speak() {        // TODO Auto-generated method stub        System.out.println("I‘m Chinese,my name is "+this.name+" ,my age is "+this.age);    }}
package IoC_AOP;public class American implements Person{    private String name;    private String age;    public American(){            }    public American(String name, String age) {        super();        this.name = name;        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getAge() {        return age;    }    public void setAge(String age) {        this.age = age;    }    @Override    public void speak() {        // TODO Auto-generated method stub        System.out.println("I‘m American,my name is "+this.name+" ,my age is "+this.age);    }    }
    public void IocTest(){        Injection in = new Injection();        Person p1 = in.proxy1("zhangsan", "18");        Person p2 = in.proxy2("tom", "19");        p1.speak();        p2.speak();    }

   Aop思想原理,通过使用动态代理来实现。

package IoC_AOP;public interface interface1 {    public void doSomething();}
package IoC_AOP;public class subject implements interface1{    public void doSomething(){        System.out.println("hello i‘m doing my jobs");    }}
package IoC_AOP;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class proxySubject implements InvocationHandler{    private Object proxied;    public proxySubject(Object proxied){        this.proxied = proxied;    }    public void setProxied(Object proxied) {        this.proxied = proxied;    }    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        // TODO Auto-generated method stub        //执行方法之前可以做一些操作                //执行目标方法        method.invoke(proxied, args);        //之后可以执行一些操作        return null;    }    }
        subject real = new subject();           interface1 proxySubject = (interface1)Proxy.newProxyInstance(interface1.class.getClassLoader(),          new Class[]{interface1.class},          new proxySubject(real));        proxySubject.doSomething();
proxy:  指代我们所代理的那个真实对象method:  指代的是我们所要调用真实对象的某个方法的Method对象args:  指代的是调用真实对象某个方法时接受的参数

  Spring的配置

    下载spring-framework-3.2.0.RELEASE,在官网下载,然后再下载commons-logging-1.2。

    添加到buildpath。下载下来的包的lib下,同一个jar包有三份。

    技术分享

    只要导入jar就行。

    技术分享

    然后导入commons-loggin的jar包。

    src下新建applicationContext.xml配置文件。配置文件的bean代表加载一个类,通过Spring的工厂生产出来并注入到应用的类。    

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd" default-autowire="byName" default-lazy-init="true"><bean id="chinese" class="Beans.Chinese">    <property name="name">        <value>sss</value>    </property>    <property name="age">        <value>18</value>    </property></bean><bean id="america" class="Beans.American">    <property name="name">        <value>xxx</value>    </property>    <property name="age">        <value>19</value>    </property></bean></beans>

  书写范例 

package Beans;public interface Person {    public void speak();}
package Beans;public class Chinese  implements Person{    private String name;    private int age;        public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    @Override    public void speak() {        // TODO Auto-generated method stub        System.out.println("I‘m Chinese,my name "+this.name+",my age "+this.age);            }}
package Beans;public class American implements Person{    private String name;    private String age;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getAge() {        return age;    }    public void setAge(String age) {        this.age = age;    }    @Override    public void speak() {        // TODO Auto-generated method stub        System.out.println("I‘m American,my name "+this.name+",my age "+this.age);    }    }

  使用Junit包进行测试。  

package JunitTest;import org.junit.Test;import org.springframework.context.*;import org.springframework.context.support.ClassPathXmlApplicationContext;import Beans.Person;public class Test1 {    @Test    public void TestSpringMethod(){        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");        Person p1=(Person)context.getBean("chinese");        p1.speak();        p1=(Person)context.getBean("america");        p1.speak();            }}

技术分享

  时日尚浅,没有经验,日后加倍努力。

Spring浅探