spring學習之一律念

概念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>
相關文章
相關標籤/搜索