Spring概念
- Spring是一個開源的輕量級框架
- Spring是一站式框架
IOC(控制反轉)(XML)
1 IOC底層原理
(1)xml配置文件
(2)dom4j解析xml
(3)工廠模式
(4)反射
2 IOC操作-入門(XML)
(1)導入jar包
(2)導入約束
<?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-3.0.xsd
"></beans>
(3)配置xml
<bean id="user" class="com.wzw.spring.day1_rumen.User"></bean>
3 IOC中的bean管理(XML)
(1)bean實例化的三種方式
1 使用類的無參構造創建
<bean id="user" class="com.wzw.spring.day1_rumen.User"></bean>
2 使用靜態工廠創建
3 使用實例工廠創建
(2)Bean標籤常用屬性
<bean id="" class="" scope=""></bean>
scope屬性:
singleton:默認值,單例,創建的是同一個對象
prototype:多例(action是多例的,使用prototype)
request:web項目中,Spring創建一個bean對象,將對象存入request域中
session:web項目中,Spring創建一個bean對象,將對象存入session域中
globalSession:(相當於一個全局session)web項目中,應用在porlet環境,如果沒有porlet環境那麼globalSession相當於session
(3)IOC和DI區別
- IOC:控制反轉,把對象創建交給Spring進行配置管理
- DI:依賴注入,創建對象過程中,向類裏面的屬性設置值
-關係:DI不能單獨存在,需要在IOC基礎之上
4 !屬性注入的三種方式(XML)
創建對象時,向類裏屬性注入值;Spring框架只支持有參構造和set方法
(1)有參構造注入
<!-- 3.1 根據有參的構造方法來屬性注入 -->
<bean id="stu" class="com.wzw.spring.Student">
<constructor-arg name="name" value="張三"></constructor-arg>
</bean>
(2)set()方法注入(常用)
<!-- 3.2 通過set方法來注入屬性 -->
<bean id="book" class="com.wzw.spring.Book">
<property name="bookName" value="西遊記"></property>
</bean>
(3)接口注入
5 !注入對象類型屬性(XML)
創建Service層實例和Dao層實例,Service實例調用Dao實例
<!-- 4 對象通過set方法來注入屬性 -->
<!-- 4.1 首先創建Dao實例 -->
<bean id="userDao" class="com.wzw.spring.UserDao"></bean>
<!-- 4.2 然後創建service實例,並通過set方法來注入屬性 -->
<bean id="userService" class="com.wzw.spring.UserService">
<!-- set方法來注入屬性
name:service類裏面屬性名稱
ref:注入屬性所對應類的id
-->
<property name="userDao" ref="userDao"></property>
</bean>
6 !注入複雜數據類型屬性(XML)
測試類
/*
* 注入複雜類型屬性
*/
private String[] arrs;
private List<String> list;
private Map<String, String> map;
private Properties properties;
public void setArrs(String[] arrs) {
this.arrs = arrs;
}
public void setList(List<String> list) {
this.list = list;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
Xml配置文件
<!-- 5 注入複雜類型屬性 -->
<bean id="person" class="com.wzw.spring.Person">
<!-- 5.1 array -->
<property name="arrs">
<array>
<value>a</value>
<value>b</value>
<ref bean="book"/>
</array>
</property>
<!-- 5.2 list -->
<property name="list">
<list>
<value>aa</value>
<value>bb</value>
<value>cc</value>
</list>
</property>
<!-- 5.3 map -->
<property name="map">
<map>
<entry key="aaa" value="d"></entry>
<entry key="bbb" value="e"></entry>
<entry key="ccc" value="f"></entry>
</map>
</property>
<!-- 5.4 properties -->
<property name="properties">
<props>
<prop key="aaaa">dd</prop>
<prop key="bbbb">ee</prop>
<prop key="cccc">ff</prop>
</props>
</property>
</bean>
IOC(註解)
1 Spring註解開發準備
(1)導入jar包
(2)導入約束
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
(3)xml配置
<!-- 1 註解 -->
<!-- 1.1 開啓註解掃描 掃描類,方法,屬性上的註解 -->
<context:component-scan base-package="com.wzw.spring"></context:component-scan>
<!-- 1.2 掃描屬性上的註解 -->
<!-- <context:annotation-config></context:annotation-config> -->
2 創建對象並注入屬性
(1)XML配置文件中創建對象
<!-- 2 xml創建對象 註解方式注入屬性 -->
<bean id="abService" class="com.wzw.spring.service.ABService"></bean>
<bean id="aDao" class="com.wzw.spring.dao.ADao"></bean>
<bean id="bDao" class="com.wzw.spring.dao.BDao"></bean>
(2)Model層
@Component(value="user")
public class User {
@Value("zhangsan")
private String username;
@Value("123")
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public User() {
super();
}
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
}
(3)Dao層
@Repository(value="userDao2")
public class UserDao2 {
@Resource(name="user")
private User user;
public User getInfo(){
return user;
}
}
(4)Service層
@Service(value="userService")
public class UserService {
// @Autowired
// @Qualifier(“userDao”)
@Resource(name="userDao")
private UserDao userDao;
public void say() {
System.out.println("service...");
userDao.say();
}
}
- @Component(value=”id名”)
// - @Controller
- @Service(value=”id名”)
- @Repository(value=”id名”)
- @Scope(scopeName=”prototype”)
- @Resource(name=”id名”)
- @Value(“屬性值”)
- @Autowired
AOP(面向切面編程)
1 AOP概念
- 擴展功能不需要修改源代碼
- AOP採取橫向抽取機制,取代了傳統縱向抽取機制的重複性代碼
2 AOP底層原理
3 AOP術語
Joinpoint(連接點):類裏面可以被增強的方法
Pointcut(切入點):類中實際被增強的方法
Advice(通知/增強):增強的邏輯(功能)(前置、後置、環繞、異常、最終增強)
Aspect(切面):把增強應用到具體方法上的過程
Introduction(引介):
Target(目標對象):要增強的類
Weaving(織入):把advice應用到target的過程,
Proxy(代理):
4 !AOP操作(XML)
(1)導入jar包
(2)導入約束
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
(3)配置xml文件
<!-- AOP 切面編程 -->
<!-- 1 配置對象 -->
<bean id="car" class="com.wzw.spring.model.Car"></bean>
<bean id="myCar" class="com.wzw.spring.aop.MyCar"></bean>
<!-- 2 配置aop操作 -->
<aop:config>
<!-- 2.1 配置切入點 -->
<aop:pointcut expression="execution(* com.wzw.spring.model.Car.*(..))" id="pointcut1"/>
<!-- 2.2 配置切面 -->
<aop:aspect ref="myCar">
<aop:before method="before1" pointcut-ref="pointcut1"/>
<aop:after-returning method="after1" pointcut-ref="pointcut1"/>
<aop:around method="around1" pointcut-ref="pointcut1"/>
</aop:aspect>
</aop:config>
(4)環繞增強
//環繞增強
public void around1(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
//方法前
System.out.println("方法之前。。。");
//執行被增強的方法
proceedingJoinPoint.proceed();
//方法後
System.out.println("方法之後");
}
5 AOP操作(註解)
(1)導入jar包和約束,並配置xml文件
<!-- 1 aop註解方式 -->
<!-- 1.1 創建對象 -->
<bean id="book" class="com.wzw.spring.model.Book"></bean>
<bean id="myBook" class="com.wzw.spring.aop.MyBook"></bean>
<!-- 1.2 開啓aop註解掃描 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
(2)創建advice類,並註解
@Aspect
public class MyBook {
@Before(value="execution(*com.wzw.spring.model.Book.*(..)))
public void before1() {
System.out.println("前置增強...");
}
}
Spring事務