热度最大的框架,它也称为业务层框架。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(); } }
时日尚浅,没有经验,日后加倍努力。