簡介:
??可以認為spring是一個容器(container)
-
包含內(nèi)容:
- Ioc/DI 控制反轉(zhuǎn)/依賴注入
- AOP 面向切面編程
-
聲明事務。
Runtime
- test:spring提供的測試功能。
-
core container:核心容器蛾洛。spring啟動最基本的條件诱担。
- spring中最大的容器是,applicationContext。
- Beans:負責創(chuàng)建并管理對象的。
- Core:核心類庫。
- Context:上下文參數(shù)稍走,獲取外部資源或者管理注解。
- SpEl:expression.jar
- Date Access/Integration:封裝數(shù)據(jù)訪問層相關(guān)內(nèi)容
- Web:完成web相關(guān)功能是需要柴底。
一婿脸、Spring環(huán)境搭建
- 導包,除了上面所說的啟動基本條件的包外柄驻,還有一個日志打印的包狐树。
jar
- 在src下新建applicationContext.xml文件
- Spring 容器ApplicationContext,xml文件配置的信息最終都存儲到了ApplicationContext容器中鸿脓。
- spring配置文件:基于schema抑钟。語法檢查器涯曲。
- schema文件擴展名.xsd
- 把schema理解成DTD 的升級版。比DTD具備更好的擴展性在塔,
- 通過bean標簽來創(chuàng)建對象幻件。
- 默認是配置文件被加載時候就創(chuàng)建對象
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!--
id:獲取到的對象標識
class:創(chuàng)建哪個類的對象
-->
<bean id="peo" class="com.qdl.pojo.People" />
</beans>
- 編寫測試方法。
- getBean("id值"蛔溃,“返回值類型”)绰沥。不寫返回值類型默認是object
- getBeanDefinitionNames,獲取spring所管理的所有對象名字贺待。
//配置文件一加載 類就會創(chuàng)建徽曲,而且會去尋找無參構(gòu)造方法。
ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
People people = ac.getBean("peo",People.class);
System.out.println(people);
//獲取spring所管理的對象名字
String[] names = ac.getBeanDefinitionNames();
二麸塞、創(chuàng)建對象的三種方式(IoC)
IoC-控制反轉(zhuǎn)
- 是什么秃臣?
- 原來有程序員主動new實例化對象的事情,轉(zhuǎn)交給spring負責
- 控制:控制類的對象哪工。
- 發(fā)轉(zhuǎn):轉(zhuǎn)交給spring負責奥此。
- 優(yōu)點:解耦,程序員不需要管理對象了雁比,解除了對象管理和程序員之間的耦合得院。
1. 通過構(gòu)造方法創(chuàng)建
- 無參構(gòu)造創(chuàng)建:默認創(chuàng)建
- 有參構(gòu)造創(chuàng)建:需要明確配置
<bean id="peo" class="com.qdl.pojo.People">
ref 是引用另一個bean,value是基本數(shù)據(jù)類型或string類型
index:指代的是有參構(gòu)造器中的第幾個參數(shù)章贞,
name:指代的是有參構(gòu)造器中參數(shù)的名字
type:指代參數(shù)的類型。
<constructor-arg index="0" value="1"></constructor-arg>
<constructor-arg index="1" value="張三"></constructor-arg>
<constructor-arg index="2" value="23"></constructor-arg>
</bean>
2. 實例工廠
- 工廠設(shè)計模式:幫助創(chuàng)建類對象非洲,一個工廠可以生產(chǎn)多個對象鸭限。
- 創(chuàng)建實例工廠
public class PeopleFactory {
public People newInstance() {
return new People(2,"秦得力",23);
}
}
- 在xml文件中配置工廠對象和需要創(chuàng)建的對象。
<bean id="factory" class="com.qdl.pojo.PeopleFactory"></bean>
<bean id="peo1" factory-bean="factory" factory-method="newInstance"></bean>
3. 靜態(tài)工廠
- 創(chuàng)建工廠的靜態(tài)方法两踏。
- 在xml文件中配置 bean如下,指定其中的工廠方法即可败京。
<bean id="peo2" class="com.qdl.pojo.PeopleFactory" factory-method="newInstance"></bean>
三、給bean對象參數(shù)賦值
1梦染、通過構(gòu)造方法赡麦,在創(chuàng)建類的時候賦初始值。
2帕识、設(shè)置注入(通過set方法)
- 設(shè)置注入就是走的類的get和set方法泛粹。
- 如果是基本數(shù)據(jù)類型或者string 類型則使用下面的方法。
- 其中的value標簽可以寫道property標簽中間肮疗。
<bean id="peo" class="com.qdl.pojo.People">
<property name="id" value="1"></property>
<property name="name" value="秦得力"></property>
<property name="age" value="23"></property>
</bean>
- 如果是參數(shù)類型是set
<property name="sets">
<set>
<value>1</value>
<value>2</value>
<value>3</value>
</set>
</property>
- 參數(shù)類型是list
- 方法同上晶姊,
- 但是如果list中只有一個值,可以使用下面的方法:
<property name="list" value="1"></property>
- 參數(shù)類型是數(shù)組類型(array)
- 方法同上伪货,
- 如果數(shù)組中只有一個值们衙,同樣可以同上钾怔。
- 參數(shù)是map
<property name="maps">
<map>
<entry key="1" value="1"></entry>
<entry key="2" value="2"></entry>
<entry key="3" value="3"></entry>
</map>
</property>
- 參數(shù)是properties
<property name="demo">
<props>
<prop key="1">value</prop>
</props>
</property>
四、DI/依賴注入
- 和IoC是一樣的蒙挑,只不過是在其中一個對象中傳入另一個對象的參數(shù)
- 上面一段是people類宗侦,中間傳入?yún)?shù)desk類的一個對象,使用DI注入忆蚀。
<bean id="peo" class="com.qdl.pojo.People">
<property name="desk" ref="desk"></property>
</bean>
-----------------------------------------------------------------
<bean id="desk" class="com.qdl.pojo.Desk">
<property name="id" value="1"></property>
<property name="price" value="100"></property>
</bean>
五矾利、使用spring簡化mybatis
1、導包
- mybatis所有的包蜓谋、spring基本包梦皮、spring-jdbc、spring-tx桃焕、spring-aop剑肯、spring整合mybatis的包。
2观堂、配置xml文件
-- 數(shù)據(jù)源封裝類:獲取數(shù)據(jù)庫連接的類
1让网、導包:JDBC的spring支持包,mybatis的包师痕、
-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/ssm?useSSL=false & serverTimezone=UTC"></property>
<property name="username" value="root"></property>
<property name="password" value="qinyu888"></property>
</bean>
-- 回憶前面我們寫mybatis的時候溃睹,在opensession之前加載的mybatis.xml
因此,這里需要為其添加datasource胰坟。
-->
-- 創(chuàng)建sqlSessionFactory對象 -->
<bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>
-- 掃描器因篇,相當于mybatis.xml中的mappers下的package標簽,掃描mapper后笔横,會給對應接口創(chuàng)建對象 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
-- 要掃描哪個包 -->
<property name="basePackage" value="com.qdl.mapper"></property>
-- 和factory產(chǎn)生關(guān)系 -->
<property name="sqlSessionFactory" ref="factory"></property>
</bean>
-- 這里的ref中為什么要這樣寫竞滓,是因為spring會自動把mpper的類名這樣命名 -->
<bean id="peopleService" class="com.qdl.service.impl.PeopleServiceImpl">
<property name="peopleMapper" ref="peopleMapper"></property>
</bean>
3、編寫代碼
- 編寫pojo
- 編寫mapper包下時吹缔,必須使用接口綁定方案或注解方案(必須有接口)因為再service的實現(xiàn)層中商佑,必須要創(chuàng)建接口對象。不然沒辦法創(chuàng)建
- 再sevice實現(xiàn)類中聲明Mapper接口對象厢塘,并生成get和set方法茶没。(為了讓spring來代理)
- spring無法管理servlet
public class PeopleServiceImpl implements PeopleService {
private PeopleMapper peopleMapper=null;
public PeopleMapper getPeopleMapper() {
return peopleMapper;
}
public void setPeopleMapper(PeopleMapper peopleMapper) {
this.peopleMapper = peopleMapper;
}
public List<People> show() {
return peopleMapper.selAll();
}
}
4. 編寫servlet層代碼,流程如下所示
- 兩種方式加載配置文件:
- 使用tomcat手動加載配置文件晚碾。
- 使用tomcat自動加載配置文件需要步驟如下:
- 導包:spring-web
- 編寫web.xml配置文件抓半,讓tomcat自動去加載
<!-- 上下文參數(shù) -->
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- spring配置文件 -->
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 封裝了一個監(jiān)聽器,幫助加載spring的配置文件 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
- 書寫servlet代碼
- 上面注釋的的手動加載格嘁,下面的是讓tomcat管理琅关,加載好我們拿出來用。
//@WebServlet("/people")
public class PeopleServlet extends HttpServlet {
private PeopleService peopleService;
@Override
public void init() throws ServletException {
//下面這一條代碼是我們設(shè)置tomcat去加載配置文件
//ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
// spring和web整合后的所有信息都存放再webApplicationContext中
//下面這段代碼可以讓tomcat啟動的時候自動加載配置文件。
WebApplicationContext ac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
peopleService = ac.getBean("peopleService",PeopleServiceImpl.class);
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
List<People> show = peopleService.show();
PrintWriter out=resp.getWriter();
out.write(show.toString());
}
}