Spring是什么

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>