1、spring概述
spring是一個開源的設計層面框架,解決的是業務邏輯和其他各層的松耦合問題,
因爲他將面向接口的編程思想貫穿整個系統應用。Spring是於2003 年興起的一個輕量
級的Java 開發框架,由Rod Johnson創建。簡單來說,Spring是一個分層的JavaSE/EEfull-stack(一站式)輕量級開源框架。
spring框架由很多模塊組成,IOC、AOP、spring MVC、spring事務等,
當然spring也可以整合其他框架例如:mybatis、shiro等。
2、spring IOC
在java程序中,一個業務邏輯的實現往往需要多個對象來協作完成。在程序中我們使
用new Object()的方式創建對象,並且還要維護對象之間的相互依賴創建。所謂IOC(Inve
rsion of Control,控制反轉),對於spring框架來說,就是由spring來負責控制對象的生
命週期以及對象之間的關係。對象的創建、銷燬,對象之間的相互依賴關係都由spring來完
成,對象只需要關心業務邏輯本身就可以了。控制反轉就是獲得依賴對象的方式反轉了。
2、1
--需要的jar包
--spring-core-4.3.5.RELEASE.jar
--spring-beans-4.3.5.RELEASE.jar
--spring-context-4.3.5.RELEASE.jar
--spring-logging-4.3.5.RELEASE.jar
--spring-expression-4.3.5.RELEASE.jar
2、2
創建spring配置文件
新建spring配置文件applicationContext.xml,該文件爲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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
</beans>
2、3測試
@Test
public void testInitContext(){
String conf = "applicationContext.xml";
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext(conf);
System.out.println(applicationContext);
}
3 spring容器創建JavaBean
1、在applicationContext.xml中添加bean對象創建聲明
<!-- 用構造器來實例化bean -->
<bean id="userDao" class="com.ztd.springdemo.demo01.UserDao"></bean>
1.2、獲得bean
@Test
public void testInitContext(){
//1.實例化spring容器
String conf = "applicationContext.xml";
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext(conf);
//2.獲得容器創建的bean實例
UserDao userDao =
(UserDao)applicationContext.getBean("userDao");
userDao.create();
}
1.3、bean屬性注入
1、以構造方法的方式注入屬性
<bean id="user" class="com.ztd.springdemo.demo01.User">
<constructor-arg name="account" value="admin"/>
<constructor-arg name="username" value="管理員"/>
</bean>
注意:必須有這個構造方法纔行,參數名與構造方法中的保持一致
2、以set方法的方式注入屬性
<bean id="user" class="com.ztd.springdemo.demo01.User">
<property name="account" value="admin"/>
<property name="username" value="管理員"/>
</bean>
注意:必須要有無參構造器方法和對應的getter/setter方法
3、對象類型的屬性的注入
<bean id="userDao" class="com.ztd.springdemo.demo01.UserDao"
init-method="init" destroy-method="destory" scope="singleton" />
<bean id="userService" class="com.ztd.springdemo.demo01.UserService">
<!-- ref屬性:引用另一個bean的id或name -->
<property name="userDao" ref="userDao"></property>
</bean>
1.3、bean標籤屬性介紹
1、bean的創建模式
scope屬性指定了bean的創建模式
--singleton:單利的,默認的,只創建一個對象,調用getbean方法獲取到的
是同一個對象
--prototype多例的,每次調用getbean方法獲取的對象是從新創建的
<bean id="userDao" class="com.ztd.springdemo.demo01.UserDao"
scope="prototype"/>
2、bean初始化和銷燬的回調方法
init-method屬性指定的方法,在bean創建後自動調用
<bean id="userDao" class="com.ztd.springdemo.demo01.UserDao"
init-method="init"/>
destory-method屬性指定的方法,在bean銷燬前自動調用
<bean id="userDao" class="com.ztd.springdemo.demo01.UserDao"
destroy-method="destroy"/>
3、bean初始化時間
lazy-init屬性指定了bean的創建時間
false:spring容器創建時就創建該bean
true:使用該bean時創建
<bean id="userDao" class="com.ztd.springdemo.demo01.UserDao"
lazy-init="true"/>
4 spring自動組件掃描
一般在xml配置文件中,聲明一個bean或組件,spring容器會檢測和註冊該bean或組件。
除了這種方式之外,spring還支持自動掃描bean或組件,這樣就不必再在xml文件中繁瑣的
聲明bean或組件。
4.1、在applicationContext.xml中指定掃描類的路徑
<context:component-scan base-package="com.ztd.springdemo.demo02"/>
如上註解會自動掃描com.ztd.springdemo.demo02包及其子包下所有組件類
4.2、使用註解標註類
指定了掃描路徑後並不是該路徑下所有類都會被spring容器實例化註冊,只是在類上加上
指定的註解標記時spring容器纔會實例化註冊。
@Component 通用註解
@Repository 持久化層組件註解
@Service 業務層組件註解
@Controller 控制層組件註解
以上註解目前功能是一樣,爲了讓標註類本身的用途看起來更清晰。
import org.springframework.stereotype.Component;
@Component
public class UserDao {
public void create(){
System.out.println("創建了一個user");
}
}
默認bean名字爲類名首字母小寫,如需自己指定bean的名字,使用如下方式
@Component(“bean名字”)
@Component("userDao")
public class UserDaoImpl implements UserDao{
public void create(){
System.out.println("創建了一個user");
}
}
4.2、bean屬性注入
1、 @Value 用於注入普通類型的屬性
@Value(“admain”)
private String account;
2、@Autowried 自動裝配,是spring的註解
默認按照類型注入
若按名子注入則需要加@Qualifier強制使用名字注入
@Autowried
@Qualifier("userDaoImpl")
private UserDao;
3、@Resource 是JavaEE的註解
先按照名字注入,找不到,則按照類型
如需指定名字@Resource(name="bean名字")
@Resource(name="userDaoImpl")
private UserDao userDao;
4.3 指定bean的創建模式
默認爲單利模式,如需多例@Scope(“prototype”)
@Component
@Scope("prototype")
public class UserService {
}
4.4、指定bean初始化和銷燬的回調方法
bean初始化後的方法@PostConstruct
bean銷燬前執行的方法@PreDestroy
@PostConstruct
public void init(){
System.out.println("userDao 創建");
}
@PreDestroy
public void destroy(){
System.out.println("userDao 銷毀");
}
5、spring在web應用中的使用
1、加入spring-web-*jar
2、在web.xml中加入
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web,context.ContextLoaderlistener</listener-class>
<listener>
3、從servletContext中獲取spring容器實例
ServletContext sc = getServletContext();
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(sc);