概念java
一、是開源的輕量級框架web
二、是一站式框架,就是說在java ee的三層結構中,每一層它都提供了不一樣的解決技術spring
web層:springMVC數據庫
servoce層:spring IOC ,控制反轉,經過配置的方式來建立bean對象express
dao層:spring的jdbcTemplate編程
三、包含兩大核心部分數組
(1)aop: 面向切面編程,相對於傳統的縱向繼承方式擴展功能,這種方式不需修改源代碼就能夠作到擴展,主要用於事務管理spring-mvc
(2) ioc : 控制反轉,配置文件來實現建立對象服務器
Ioc實現原理session
這個技術的目的很簡單,就是從配置文件中讀出想要類名字串,利用反射來建立出他的實例,原理以下圖
所需jar包 爲4個核心的包
--- spring-beans-4.2.4.RELEASE.jar
--- spring-context-4.2.4.RELEASE.jar
--- spring-core-4.2.4.RELEASE.jar
--- spring-expression-4.2.4.RELEASE.jar
ioc的兩種建立類的方式
(1)配置文件建立
(2)註解方式
-- 配置文件方式
第一步 建立配置文件,文件名與位置不固定,建議放在src下面,名字與源代碼中默認文件名相同applicationContext.xml
第二步 在配置文件中引入schema約束文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" 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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd " default-autowire="byName"> </beans>
第三步,配置須要建立的類
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" 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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd " default-autowire="byName">
//ioc配置 <bean id = "user" class="cn.blueto.com.User"></bean> </beans>
第四步, 引用對象
//加載配置文件 ApplicationContext c = new ClassPathXmlApplicationContext("applicationContext.xml"); //根據配置文件中的對象id取出 User user=c.getBean("user");
在這裏值得注意的是,bean標籤裏有幾種屬性須要記住
1)id 表示對象的id,被引用時可填Id
2) class 建立對象所在的類的路徑
3) name 與id效果同樣,爲了兼容以前的版本而保留,建議不使用
4)scope 表示範圍,取值有
-singleton 默認值就是單例,表示全局只能建立一個實例
-prototype 多例,可建立多個實例
-request 建立對象放在request域裏
-session 放在session域裏
-gloabSession 放在globalSession裏
----屬性注入
就是給對象中的屬性賦值,先看bean的定義
public class User{ private String name; //有參數構造方式注入屬性 public User(String n){ name = n; } //屬性 public void setName(String name){ this.name=name; } }
配置文件中寫法
<bean id="user" class="package.user"> //有參構造方式注入 <constructor-arg name= "name", value="叫啥名好呢"></constructor-arg> </bean>
setter方式注入
<bean id="user" class="package.user"> <property name= "name", value="叫啥名好呢"></property> </bean>
注入複雜對象寫法
public class User{ private String name; private Logininfo login; //複雜對象屬性 public void setLogininfo(Logininfo n){ login= n; } //屬性 public void setName(String name){ this.name=name; } }
複雜對象注入的配置文件中寫法
<bean id="user" class="package.user"> <property name= "login", ref="login"></property> //ref引用其餘beab對象的id </bean> <bean id="login" class="package.Logininfo"></bean>
數組等對象注入
public class User{ private String[] arrs; private List list; private Map map;
private Properties properties; //setter方法 。。。 }
<bean id="user" class="package.user"> <property name= "arrs"> <list> <value>1</value> <value>2</value> <value>3</value> </list> </property> <property name= "list"> <list> <value>a</value> <value>b</value> <value>c</value> </list> </property> <property name= "map"> <map> <entry key ="a1" value="adfdf"></entry> <entry key ="a2" value="adfdf"></entry> <entry key ="a3" value="adfdf"></entry> </map> </property> <property name= "properties"> <props> <prop key ="driverClass">com.xxx.jdbc.Driver</prop> <entry key ="passwd">123456</entry> <entry key ="user">addd</entry> </props> </property> </bean>
-- 註解方式建立對象
與上一種方式相比 ,使用註解方式的配置則簡單多了
配置文件中寫法
<beans xmlns="..."> <!-- 開戶註解掃描 到指定包裏掃描類,方法及屬性上面是否有註解,指定包若是有多個,可用逗號分隔開,若是寫成它的父包名字,則指包含父包下全部類 --> <context:componet-scan base-package="cn.blueto"></context:componet-scan> <!-- 開戶註解掃描 只掃描屬性上面是否有註解 --> <context:annotation-config></context:annotation-config> </bean>
java類中寫法
@Component(value="user")
@Scope(value="prototype") public class User{ private String name; //有參數構造方式注入屬性 public User(String n){ name = n; } //屬性 public void setName(String name){ this.name=name; } }
取得實例
//加載配置文件 ApplicationContext c = new ClassPathXmlApplicationContext("applicationContext.xml"); //根據配置文件中的對象id取出 User user=c.getBean("user");
spring中的建立對象的4個註解
-@Component
-@Controller web層
-@Service 業務層
-@Repository 持久層,數據庫操做層
目前四個註解都是同樣的效果,只是建立對象而已
spring中的注入屬性
-@Autowired 根據類名找到對象的實現類並建立,再注入到屬性中
-@Resource 注入指定類的實例到屬性中,@Resource(name="beanid")
Spring 加載配置文件原理
ioc原理是在服務加載配置文件後,建立配置文件中的bean對象,也就是執行這段代碼:
//加載配置文件 ApplicationContext c = new ClassPathXmlApplicationContext("applicationContext.xml"); //根據配置文件中的對象id取出 //User user=c.getBean("user");
那服務啓動後,在何時開始加載配置呢?它的加載過程是這樣的
--服務器啓動時,爲每一個web項目建立一個servletContext對象,當監聽器監聽到ServletContext對象建立後,開始加載配置文件,默認文件爲applicationContext.xml
--把建立的各個bean對象經過setAttribute方法存到servletContext域裏
--取對象時經過getAttribute獲得
Spring中已經封裝好了監聽器並加載配置文件的方法,若是想要在服務啓動後自動加載配置文件,只須要在web.xml文件中做以下配置便可
//配置監聽器 <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> //配置指定加載的配置文件,若是 不配置,則去Src下面找默認的applicationContext.xml <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:bean.xml</param-value> //如在src下直接寫,如不在則要加包名路徑 </context-param>