天天看點

Spring基本知識總結

1.如果你的英語足夠好可以去看spring的官網。

位址如下

https://spring.io/ 2.簡單介紹spring

①開源輕量級架構,說白了就是簡化開發

②核心部分:AOP切面程式設計:我了解的就是在不改變已有代碼的情況下去擴充一些功能。

                   IOC控制反轉:還記得剛學程式的時候麼,是private Student stu=new Student();這麼幹的。ioc就是把這個過程                                                交給spring容器來處理。是以叫做控制反轉。

                   DI依賴注入:這個是基于IOC的,也就是先交給spring管理,然後通過spring給屬性注入值。

 ③spring在javaweb的三層結構中都有相應的解決方案。

           web層             springMVC

        service層            IOC

           dao層             jdbcTemplate(一般會被Hibernate、Mybatis代替)
           

3.導入jar包

①去官網下載下傳

       下載下傳并解壓你會看到libs檔案夾下的jar包有這樣的特點

      

        spring-aop-5.0.5.RELEASE.jar這個是我們要用的jar包

        spring-aop-5.0.5.RELEASE-sources.jar這個是源碼

  ②如果用spring的基本功能,導入4個核心的jar包就可以了。

     spring-context-5.0.5.RELEASE-javadoc.jar

      spring-core-5.0.5.RELEASE.jar

      spring-expression-5.0.5.RELEASE.jar

      spring-beans-5.0.5.RELEASE.jar

      另外還需要加入commons-logging-1.1.3.jar、log4j-1.2.11.jar兩個日志的jar包,不然會出現下面異常:

     Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory

  ③建立spring核心配置檔案:

       (1)spring核心配置檔案名稱和位置不是固定的,建議放到src下面,官方建議applicationContext.xml

      (2)引入schema限制

        spring-framework-5.0.5.RELEASE/docs/spring-framework-reference/core.html

        從官方下載下傳的spring版本中找到docs->spring-framework-reference->core.html(中可以找到相關schema限制)

        如圖:


           

applicationContext.xml:

<?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.xsd">

<bean id="user" class="test1.User" ></bean>
           

User類:

public class User {

public void show(){
    System.out.println("我是User");
}           

}

測試類:

public class MainTest {

public static void main(String[] args){
    //1.加載xml檔案
    ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
    //2.拿到user對象,這裡user是bean裡面的id
    User user = (User)context.getBean("user");
    user.show();
}           

運作結果:

經過上面的步驟,最簡單的通過配置bean的方式來管理對象就成功了。下面詳細總結一下。

spring管理bean方式(IOC):

①xml配置方式(xml方式)

           ②注解方式(用的最多)(注解方式)
           

spring屬性注入方式(DI):

①set方法注入(重點)(xml方式)

            ②有參構造方法注入(xml方式)

            ③注解注入(用的比較多)(注解方式)
           

4.介紹Spring管理bean(xml方式)

(1)先來介紹bean标簽屬性

       id:唯一辨別,不能包含特殊字元。

       name:跟id作用一樣,但是可以包含特殊字元。

       class:指定類的路徑。

       scope(範圍):singleton單例 ,prototype(多例)

 (2)bean執行個體化的三種方式:

     ①使用類的無參構造函數(重點)

     注意User類的變化,編寫一個有參構造方法(此時不再有無參構造函數):


           

下面再運作會報異常:

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'user' defined in class path resource [applicationContext.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [test1.User]: No default constructor found; nested exception is java.lang.NoSuchMethodException: test1.User.()

下面我手動再寫一個無參構造函數,如下:

再來看運作結果,運作成功:

說明預設使用無參構造函數來執行個體化的。

②使用靜态工廠執行個體化(建立靜态方法,傳回類的對象)

注意applicationContext.xml變化

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">
           
<bean id="user" class="test1.BeanFactory" factory-method="getUser" ></bean>
           

建立靜态工廠類BeanStaticFactory(注意裡面的方法是 static的):

運作測試類MainText:

③使用執行個體工廠建立(建立非靜态方法,傳回類的對象)

注意applicationContext.xml變化:

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">
           
<!--<bean id="user" class="test1.BeanStaticFactory" factory-method="getUser" ></bean>-->
<bean id="beanCommonFactory" class="test1.BeanCommonFactory" ></bean>
<bean id="user" factory-bean="beanCommonFactory" factory-method="getUser"></bean>
           

建立普通工廠BeanCommonFactory

(3)屬性注入

一.使用有參構造函數注入屬性

 User類

 

 applicationContext.xml

 
           
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">

<bean id="user" class="test1.User" >
    <constructor-arg name="userName" value="小明"></constructor-arg>
</bean>
<!--<bean id="user" class="test1.BeanStaticFactory" factory-method="getUser" ></bean>-->
<!--<bean id="beanCommonFactory" class="test1.BeanCommonFactory" ></bean>
<bean id="user" factory-bean="beanCommonFactory" factory-method="getUser"></bean>-->           

運作測試類MainTest結果:

二.使用set方法注入(重點)

applicationContext.xml

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">

<bean id="user" class="test1.User" >
   <property name="userName" value="小明"></property>
</bean>
<!--<bean id="user" class="test1.BeanStaticFactory" factory-method="getUser" ></bean>-->
<!--<bean id="beanCommonFactory" class="test1.BeanCommonFactory" ></bean>
<bean id="user" factory-bean="beanCommonFactory" factory-method="getUser"></bean>-->           

運作測試類MainText結果如下:

①注入對象類型:

建立UserDao類:

建立UserService類:

修改MainTest類:

運作測試結果:

②注入複雜類型

數組、List集合、Map集合、Properties

修改UserService類:
           

public class UserService {

private UserDao userDao;
private Integer[] array;
private List<String> list;
private Map<String,String> map;
private Properties properties;
public UserDao getUserDao() {
    return userDao;
}
public void setUserDao(UserDao userDao) {
    this.userDao = userDao;
}
public Integer[] getArray() {
    return array;
}
public void setArray(Integer[] array) {
    this.array = array;
}

public List<String> getList() {
    return list;
}
public void setList(List<String> list) {
    this.list = list;
}

public Map<String, String> getMap() {
    return map;
}
public void setMap(Map<String, String> map) {
    this.map = map;
}
public Properties getProperties() {
    return properties;
}
public void setProperties(Properties properties) {
    this.properties = properties;
}           

修改applicationContext.xml

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">

<bean id="userDao" class="test2.UserDao"></bean>
   <bean  id="userService"   class="test2.UserService">
        <property name="userDao"  ref = "userDao"></property>
        <property name="array">
            <list>
                <value>1</value>
                <value>2</value>
                <value>3</value>
            </list>
        </property>
       <property name="list">
           <list>
               <value>小明1</value>
               <value>小明2</value>
               <value>小明3</value>
           </list>
       </property>
       <property name="map">
           <map>
               <entry key="a" value="A"></entry>
               <entry key="b" value="B"></entry>
               <entry key="c" value="C"></entry>
           </map>
       </property>
       <property name="properties">
           <props>
               <prop key="userName">test</prop>
               <prop key="password">123456</prop>
           </props>
       </property>
    </bean>           

修改MainTest類

public static void main(String[] args){
    //1.加載xml檔案
    ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
    //2.拿到user對象,這裡user是bean裡面的id
    //User user = (User)context.getBean("user");
    UserService userService = (UserService)context.getBean("userService");
    UserDao userDao=null;
    Integer[] array=null;
    List<String> list=null;
    Map<String,String> map=null;
    Properties properties=null;
    if(userService!=null){
         userDao=userService.getUserDao();
        array=userService.getArray();
        list=userService.getList();
        map=userService.getMap();
        properties=userService.getProperties();
    }
    if(array!=null){
        for(int i=0;i<array.length;i++){
            System.out.println(array[i]);
        }
    }
    if(list!=null&&list.size()>0){
        for (String s:list){
            System.out.println(s);
        }
    }
    if(map!=null){
        for (Map.Entry<String, String> entry : map.entrySet()) {
            System.out.println(entry.getKey() + ":" + entry.getValue());
        }
    }
    if(properties!=null){
        for (Map.Entry<Object, Object> entry : properties.entrySet()) {
            System.out.println(entry.getKey() + "=" + entry.getValue());
        }
    }

}           

5.Spring管理Bean(注解方式)

注解就是給類打上标記,這樣spring才能識别管理

注解可以打在類上,也可以打在屬性上

一:使用注解來建立對象

打在類上的注解:

@Controller(習慣放在web層)

                   @Service(習慣放在業務層)

                   @Repository(習慣放在持久層)

                   @Component

        目前這四個注解的功能是一樣的,都是放在類上用來建立對象。
           

需要再引入spring-aop-5.0.5.RELEASE.jar jar包

修改applicationContext.xml(多了spring-context.xsd schema限制,在聯網的情況下輸入<context:component-scan base-package="test1,test2"></context:component-scan>會自動添加限制)

修改User類:(@Component(value="user") 這裡user相當于bean裡面的id,可以省略value值)

MainText類:

public static void main(String[] args){
    //1.加載xml檔案
    ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
    //2.拿到user對象,這裡user是bean裡面的id
    User user = (User)context.getBean("user");
    user.show();
}           

運作結果(省略)

spring通過@Scope(value="prototype")實作多例,spring預設生成的對象是單例的

如下:

@Component(value = "user")

@Scope(value = "prototype")

private String userName;

public String getUserName() {
    return userName;
}

public void setUserName(String userName) {
    this.userName = userName;
}

public void show(){
    System.out.println("我是User");
    System.out.println("我的userName屬性值:"+this.userName);
}           

MianTest測試:

public static void main(String[] args){
    //1.加載xml檔案
    ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
    //2.拿到user對象,這裡user是bean裡面的id
    User user1 = (User)context.getBean("user");
    User user2 = (User)context.getBean("user");           

// user.show();

System.out.print(user1==user2);
}           

二:使用注解來注入屬性

@Autowired (按類型裝配)

@Resource(按名稱裝配)

關于這兩個注解的差別大家可以去網上找些資料,關于他們的資料很多

直接上代碼:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context"
   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">
<!--可以掃描包下面的 類、屬性、方法上的注解-->
<context:component-scan base-package="test1,test2"></context:component-scan>           

UserDao類:

@Repository

public class UserDao {

public void show(){

    System.out.println("我是UserDao");
}           

UserService類:(這裡用的是@Autowired注解,關于@Resource注解,下去可以自己試試)

@Service

@Autowired
private UserDao userDao;

public UserDao getUserDao() {
    return userDao;
}

public void setUserDao(UserDao userDao) {
    this.userDao = userDao;
}           

測試MainText類:

public static void main(String[] args){
    //1.加載xml檔案
    ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
    //2.拿到user對象,這裡user是bean裡面的id
    UserService userService = (UserService)context.getBean("userService");
    UserDao userDao=userService.getUserDao();
    if(userDao!=null){
        userDao.show();
    }
}           

運作結果省略。

————————————————

版權聲明:本文為CSDN部落客「ordinarySmile」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:

https://blog.csdn.net/qiwansong/article/details/80011931