Spring介紹
Spring框架是個輕量級的Java EE框架。所謂輕量級,是指不依賴于容器就能運行的。
輕量級框架是相對于重量級框架而言的,重量級框架必須依賴特定的容器,例如EJB框架就必須運行在Glassfish、JBoss等支持EJB的容器中,而不能運行在Tomcat中。
Spring以IoC、AOP為主要思想,其中IoC,Inversion of Control 指控制反轉或反向控制。在Spring框架中我們通過配置創(chuàng)建類對象,由Spring在運行階段實例化、組裝對象。AOP,Aspect Oriented Programming,面向切面編程,其思想是在執(zhí)行某些代碼前執(zhí)行另外的代碼,使程序更靈活、擴展性更好,可以隨便地添加、刪除某些功能。Servlet中的Filter便是一種AOP思想的實現(xiàn)。
Spring同時也是一個“一站式”框架,即Spring在JavaEE的三層架構[表現(xiàn)層(Web層)、業(yè)務邏輯層(Service層)、數(shù)據(jù)訪問層(DAO層)]中,每一層均提供了不同的解決技術。如下: 表現(xiàn)層(Web層):Spring MVC 業(yè)務邏輯層(Service層):Spring的IoC 數(shù)據(jù)訪問層(DAO層):Spring的jdbcTemplate Spring中的IoC操作 將對象的創(chuàng)建交由Spring框架進行管理。
針對自己初學者剛入門框架的一種學習分享,只是學會怎么去使用框架來實現(xiàn)一些Demo的分享。
IoC
IoC即控制反轉操作分為:IoC配置文件方式和IoC的注解方式。
(1)導入Spring框架中的相關jar包,以及 支持日志輸出的 commons-logging 和 log4j 的jar包;
(2)創(chuàng)建一個普通的Java類,并在該類中創(chuàng)建方法,如下:
User.java package ioc;
public class User {
public void add() {
System.out.println("add...");
}
}
(3)創(chuàng)建Spring的配置文件,進行Bean的配置
Spring的核心配置文件名稱和位置不是固定的。但官方件建議將該核心配置文件放在src目錄下,且命名為 applicationContext.xml。這個命名也不是固定的,但是用的時候相應注意就好。
這里為了方便,將核心配置文件放在src目錄下,并命名為 bean1.xml,這個配置文件模板可以到百度去找,然后復制過來即可。內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<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="user" class="com.wm103.ioc.User">
</bean>
</beans>
(4)編寫測試類進行測試,通過配置文件創(chuàng)建類對象
TestIoC.java package ioc; import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
@Test public void testUser() {
// 1. 加載Spring配置文件,根據(jù)創(chuàng)建對象
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
// 2. 得到配置創(chuàng)建的對象
User user = (User) context.getBean("user");
System.out.println(user);
user.add();
}
}
Spring的bean管理(配置文件) Bean實例化的方式
在Spring中通過配置文件創(chuàng)建對象。 Bean實例化三種方式實現(xiàn):
(1)使用類的無參數(shù)構造創(chuàng)建:
<!-- 等同于 user = new ioc.User(); -->
<bean id="user" class="ioc.User">
</bean>
(2)使用靜態(tài)工廠創(chuàng)建
<bean id="user" class="ioc.UserFactory" factory-method="createInstance">
</bean>
(3)使用實例工廠創(chuàng)建
<bean id="userFactory" class="com.wm103.ioc.UserFactory"></bean>
<bean id="user" factory-bean="userFactory" factory-method="createInstance">
</bean>
Bean標簽的常用屬性
(1)id屬性:
用于指定配置對象的名稱,不能包含特殊符號。
(2)class屬性:創(chuàng)建對象所在類的全路徑。
(3)name屬性:功能同id屬性一致。但是在name屬性值中可以包含特殊符號。
(4)scope屬性 singleton:默認值,單例 單例模式下,在程序下只有一個實例。非單態(tài)模式下,每次請求該Bean,都會生成一個新的對象。 prototype:多例 request:創(chuàng)建對象后將對象存放到request域 session:創(chuàng)建對象后將對象存放到session域 globalSession:創(chuàng)建對象后將對象存放到globalSession域 屬性注入
屬性注入指創(chuàng)建對象時,向類對象的屬性設置屬性值。
在Spring框架中支持set方法注入和有參構造函數(shù)注入,即創(chuàng)建對象后通過set方法設置屬性或采用有參構造函數(shù)創(chuàng)建對象并初始化屬性。 使用有參構造函數(shù)注入屬性
package ioc;
public class Demo1 {
private String demoName;
public Demo1(String demoName) {
this.demoName = demoName;
}
public void out() {
System.out.println("This is Demo1.");
}
}
bean的配置:
<bean id="demo1" class="com.wm103.ioc.Demo1">
<constructor-arg name="demoName" value="Demo1">
</constructor-arg>
</bean>
創(chuàng)建Demo1對象進行測試:
@Test public void testDemo1() {
// 1. 加載Spring配置文件,根據(jù)創(chuàng)建對象
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
// 2. 得到配置創(chuàng)建的對象
Demo1 demo1 = (Demo1) context.getBean("demo1");
System.out.println(demo1);
demo1.out();
}
使用set方法注入屬性
package ioc;
public class Demo2 {
private String demoName;
public void setDemoName(String demoName) {
this.demoName = demoName;
}
public void out() {
System.out.println("This is Demo2.");
}
}
bean的配置:
<bean id="demo2" class="com.wm103.ioc.Demo2">
<property name="demoName" value="Demo2">
</property>
</bean>
創(chuàng)建Demo2對象進行測試:
@Test public void testDemo2() {
// 1. 加載Spring配置文件,根據(jù)創(chuàng)建對象
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
// 2. 得到配置創(chuàng)建的對象
Demo2 demo2 = (Demo2) context.getBean("demo2");
System.out.println(demo2);
demo2.out(); }