简单来说Spring就是处理对象的创建、以及对象的依赖关系,之前的解决方案我们都是采用entity、dao、service、servlet、Jsp分开写,并且注意这些包之间的依赖关系,现在的Spring框架使得这件事情变得十分的简单,这是功能最强大的一个框架。Spring框架主页:www.springsource.org 。
Spring框架,可以解决对象创建以及对象之间的依赖关系的一种框架,且可以和其它框架一起使用,包括Spring和Struts、Spring和Hibernate框架的整合,总的来说,Spring框架是一个起到整合(粘合)作用的框架。
组件/框架设计
控制反转 Inversion on Control
需要什么就创建什么,这属于需求驱动型,这是”控制正转”,而将对象的创建交给外部容器完成,这叫作控制反转,想要拿到别人创建的对象,必须有一个可以获取该对象的公用的接口。控制反转主要是用来解决对象创建的问题(对象创建交给其它容器)
AOP 面向切面编程
切面,简单来说可以理解为一个类,由很多重复代码形成的类。举例来说包括:事务、日志、权限等。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
beans>
package com.jpzhutech.spring;
import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
public class App {
//通过工厂类得到容器创建的对象
@Test
public void testIOC1() throws Exception{
//创建对象
//User user = new User(); //在Spring之前创建对象的方法
//现在将对象的创建交给Spring的IOC容器
Resource resource = new ClassPathResource("com/jpzhutech/spring/applicationContext.xml"); //在这里一定要注意导入spring的包
//创建容器对象(bean工厂),也称为IOC容器=工厂类+applicationContext.xml文件
BeanFactory factory = new XmlBeanFactory(resource);
//得到容器创建的对象
User user = (User)factory.getBean("user");
System.out.println(user);
}
//直接得到IOC容器对象,该方法比较方便,在后续的ssm学习中,采用该方法创建对象
@Test
public void testIOC2() throws Exception{
//得到容器对象
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("com/jpzhutech/spring/applicationContext.xml");
//从容器中获取bean
User user = (User)applicationContext.getBean("user");
System.out.println(user);
}
}
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="user" class="com.jpzhutech.spring.User"> bean>
beans>
//注意该类没有构造函数,创建对象时使用Spring的特性去创建
package com.jpzhutech.spring;
public class User {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Spring为我们默认创建的对象时单例的,但是可以在xml中配置单例或者多例模式。多例模式只有在对象需要的时候才创建对象,而对于单例模式,在容器创建之前就已经创建好了对象,整个应用只有这一个对象,这是二者的区别。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="user" class="com.jpzhutech.spring.User" scope="prototype" lazy-init="default" > bean>
beans>
SpringIOC容器是Spring的核心内容,作用是用于对象的创建,解决对象之间的依赖关系。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="user1" class="com.jpzhutech.spring.User" scope="prototype" lazy-init="default" > bean>
<bean id="user2" class="com.jpzhutech.spring.User">
<constructor-arg value="100" index="0" type="int" >constructor-arg>
<constructor-arg value="jpzhu" index="1" type="java.lang.String" >constructor-arg>
bean>
<bean id="str" class="java.lang.String" scope="singleton">
<constructor-arg index="0" value="Jack" type="String">constructor-arg>
bean>
<bean id="user3" class="com.jpzhutech.spring.User">
<constructor-arg value="100" index="0" type="int" >constructor-arg>
<constructor-arg ref="str" index="1" type="java.lang.String" >constructor-arg>
bean>
<bean id="factory" class="com.jpzhutech.spring.ObjectFactory">bean>
<bean id="user4" factory-bean="factory" factory-method="getInstance">bean>
<bean id="user5" factory-method="getInstance_static" class="com.jpzhutech.spring.ObjectFactory">
<constructor-arg value="101" type="int">constructor-arg>
<constructor-arg value="jiamin" type="String">constructor-arg>
bean>
beans>
package com.jpzhutech.spring;
import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
@SuppressWarnings("deprecation")
public class App {
//通过工厂类得到容器创建的对象
@Test
public void testIOC1() throws Exception{
//创建对象
//User user = new User(); //在Spring之前创建对象的方法
//现在将对象的创建交给Spring的IOC容器
Resource resource = new ClassPathResource("com/jpzhutech/spring/applicationContext.xml"); //在这里一定要注意导入spring的包
//创建容器对象(bean工厂),也称为IOC容器=工厂类+applicationContext.xml文件
BeanFactory factory = new XmlBeanFactory(resource);
//得到容器创建的对象
User user = (User)factory.getBean("user");
System.out.println(user);
}
//直接得到IOC容器对象,该方法比较方便,在后续的ssm学习中,采用该方法创建对象
@Test
public void testIOC2() throws Exception{
//得到容器对象
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("com/jpzhutech/spring/applicationContext.xml");
//从容器中获取bean
User user1 = (User)applicationContext.getBean("user1");
User user2 = (User)applicationContext.getBean("user2"); //使用带参数的构造函数
User user3 = (User)applicationContext.getBean("user3"); //使用带参数的构造函数
System.out.println(user1);
System.out.println(user2.getName());
//System.out.println((String)applicationContext.getBean("str")); //使用在配置文件中创建的对象
System.out.println(user3.getName());
User user4 =(User)applicationContext.getBean("user4");
System.out.println("user4对象为:"+user4);
User user5 = (User)applicationContext.getBean("user5");
System.out.println("user5对象为:"+user5);
}
}
package com.jpzhutech.spring;
public class User {
private int id;
private String name;
public User() {
super();
}
public User(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + "]";
}
package com.jpzhutech.spring;
public class ObjectFactory {
//工厂实例方法创建对象
public User getInstance(){
return new User();
}
//工厂静态方法创建对象
public static User getInstance_static(int id , String name){
return new User(id,name);
}
}
对象依赖关系解决的问题是如何给Spring中的属性赋值,属性赋值的方法和代码测试如下
applicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="user1" class="com.jpzhutech.property.User" lazy-init="default" >
<constructor-arg value="10" index="0" type="int">constructor-arg>
<constructor-arg value="jpzhu" index="1" type="String" >constructor-arg>
bean>
<bean id="user2" class="com.jpzhutech.property.User" >
<property name="id" value="101">property>
<property name="name" value="jiamin">property>
bean>
<bean id="user3" class="com.jpzhutech.property.User" >
<property name="id" value="10000">property>
<property name="name">
<bean id = "str" class="java.lang.String" >
<constructor-arg value="Jack">constructor-arg>
bean>
property>
bean>
<bean id="string1" class="java.lang.String" >
<constructor-arg value="Rose">constructor-arg>
bean>
<bean id="user4" class="com.jpzhutech.property.User" p:name-ref="string1">bean>
<bean id="name" class="java.lang.String" >
<constructor-arg value="Fuck">constructor-arg>
bean>
<bean id="user5" class="com.jpzhutech.property.User" autowire="byName">bean>
<context:component-scan base-package="com.jpzhutech" >context:component-scan>
beans>
package com.jpzhutech.property;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App {
private ApplicationContext applicationContext;
@Test
public void testProperty() throws Exception{
//创建IOC容器
applicationContext = new ClassPathXmlApplicationContext("com/jpzhutech/property/applicationContext.xml");
//user1通过构造函数创建对象
User user1 = (User)applicationContext.getBean("user1");
System.out.println("id:"+user1.getId()+" name:"+user1.getName() );
//user2通过set方法为属性注入值
User user2 = (User)applicationContext.getBean("user2");
System.out.println("id:"+user2.getId()+" name:"+user2.getName());
//user3内部bean构造对象,逻辑容易出错
User user3 = (User)applicationContext.getBean("user3");
System.out.println("id:"+user3.getId()+" name:"+user3.getName());
//利用p名称空间构造对象
User user4 = (User)applicationContext.getBean("user4");
System.out.println("id:"+user4.getId()+" name:"+user4.getName());
//自动装配
User user5 = (User)applicationContext.getBean("user5");
System.out.println("id:"+user5.getId()+" name:"+user5.getName());
//注解方式给属性注入值
}
}
package com.jpzhutech.property;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
@Component
public class User {
private int id;
@Resource //这种注解方式是根据类型进行查找的,必须要确保该类型只有一个变量,所以我们一般情况还是要明确给出其中参数的
private String name;
public User() {
super();
}
public User(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + "]";
}
}