Spring是什么
Spring是一个对象容器,它应用依赖注入和控制反转技术完成对象的封装,开发者可以通过Spring的应用上下文(ApplicationContext)直接获得对象的引用并使用它。Spring利用AOP(面向方面编程)对类生成动态代理,可以为开发者扩展类的行为,开发者可以通过XML配置或者使用Java注解的方式扩展类的功能。
Spring核心思想
控制反转
依赖注入
AOP面向方面编程
控制反转
程序代码不负责依赖对象的创建及维护,它依赖对象的创建及维护是由Spring容器负责的。通俗地说,开发人员不需要关心对象的创建工作,通过Spring的ApplicationContext上下文取得对象引用即可使用。所有对象是由Spring容器创建的。
传统Java代码设计,由开发者创建所需对象。
java
package com.hk.bean;
public class UserInfo {
private String id = null;
private String name = null;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
java
package com.hk.bean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args)
{
UserInfo ui = new UserInfo();
System.out.println("ui="+ui);
}
}
控制反转由Spring容器负责创建对象。
xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userinfo" class="com.hk.bean.UserInfo"/>
<bean id="orginfo" class="com.hk.bean.OrgInfo">
<property name="mgr" ref="userinfo"/>
</bean>
</beans>
java
package com.hk.bean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args)
{
//UserInfo ui = new UserInfo();
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
UserInfo ui = (UserInfo)ac.getBean("userinfo");
System.out.println("ui="+ui);
}
}
控制反转
Spring的控制反转功能是通过Java反射机制实现的,
依赖注入
在运行期,由Spring容器动态地将依赖对象注入到另一个对象中,简单地说,是Spring容器为对象的成员变量赋值过程,可以通过构造方法或方法进行依赖注入。依赖注入是通过Java的内省机制完成的。
java
package com.hk.bean;
public class OrgInfo {
private String id = null;
private String name = null;
private UserInfo mgr = null;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public UserInfo getMgr() {
return mgr;
}
public void setMgr(UserInfo mgr) {
this.mgr = mgr;
}
}
xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userinfo" class="com.hk.bean.UserInfo"/>
<bean id="orginfo" class="com.hk.bean.OrgInfo">
<property name="mgr" ref="userinfo"/>
</bean>
</beans>
java
package com.hk.bean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main2 {
public static void main(String[] args)
{
ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
OrgInfo oi = (OrgInfo)ac.getBean("orginfo");
System.out.println("oi="+oi+",oi.mgr="+oi.getMgr());
}
}
AOP面向方面编程
面向对象编程思想主张低耦合高内聚特点,模块之间要么联系紧密,要么彼此没有联系。这样在所有代码模块上统一改变功能非常困难,面向方面编程就应运而生。

AOP面向方面编程
面向方面编程是使用动态代理来实现的,代理设计模式分为两种:
静态代理
静态代理使用编程实现
动态代理
动态代理使用Java Proxy代理机制或者CgLib第三方库实现
使用Maven命令创建Maven工程
mvn archetype:generate -DinteractiveMode=false -DgroupId=com.hk.hr -DartifactId=hkweb -Dversion=1.0 -DarchetypeArtifactId=maven-archetype-quickstart
Spring依赖库
xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.2.18.RELEASE</version>
</dependency>