Spring

Posted Ivyvivid

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring相关的知识,希望对你有一定的参考价值。

Spring

一个开源的应用程序框架,一个一站式的框架。

    1.IoC容器
    2.AOP实现
    3.数据访问支持:简化hibernate编码,声明式事物
    4.Web集成

一般代指Spring Framework。

Spring Framework

    

Spring提供了表现层(mvc)到业务层(Spring)再到数据层(data)的全套解决方案,基于Spring,你可以方便的与其他框架进行集成,如hibernateibatis,structs等,Spring官方的原则是绝不重复造轮子,有好的解决方案只需要通过Spring进行集成即可。Spring Framework 本身并未提供太多具体的功能,它主要专注于让你的项目代码组织更加优雅,使其具有极好的灵活性和扩展性,同时又能通过Spring集成业界优秀的解决方案

 

Inversion of Control(控制反转/Dependency Inversion Principle):
    1.一个重要的面向对象编程的法则来削减计算机程序的耦合问题
    2.轻量级的Spring框架的核心


 IoC负责什么?   

  1. 创建对象
  2. 管理对象(通过依赖注入DI)
  3. 装配对象
  4. 配置对象
  5. 管理对象生命周期

实现技术:
    1.Java反射技术实现
    2.配置文件组装对象

将组件对象的控制权从代码本身转移到外部容器
    1.组件化思想:分离关注点,接口和实现分离
    2.依赖的注入:将组件的构建和使用分开

Ioc最重要的2个类是什么?

  • BeanFactory
    • bean的定义
    • 读取bean配置文档
    • 管理bean加载、实例化
    • 控制bean的生命周期
    • 维护bean之间的依赖 
  • ApplicationContext,这是BeanFactory的子接口
    • 支持国际化
    • 统一的资源文件访问方式
    • 提供在监听器中注册bean事件
    • 同时加载多个配置文件
    • 载入多个上下文  

范例:
1.HelloSpring类

package com.Elastic.SpringDemo1.ivy.demo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class HelloSpring {
    private String meg;

    public String getMeg() {
        return meg;
    }

    public void setMeg(String meg) {
        this.meg = meg;
    }
    
    public void sayHello() {
        System.out.println("Hello," + meg);
    }
    
    public static void main(String[] args) {
        /*//1.创建对象
        HelloSpring hs = new HelloSpring();
        //2.給对象赋值
        hs.setMeg("Spring !!!");
        //3.调用对象的方法
        hs.sayHello();*/
        
        //使用Spring完成上面的操作
        //1.创建Spring IoC容器
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2.通过容器获得对象
        HelloSpring hs = (HelloSpring) context.getBean("helloSpring");
        //3.调用对象的方法
        hs.sayHello();
    }
}


2.applicationContext.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xsi:schemaLocation="http://www.springframework.org/schema/beans
 5            http://www.springframework.org/schema/beans/spring-beans.xsd">
 6 
 7     <!-- 由Spring的IoC容器创建对象 -->
 8       <bean id="helloSpring" class="com.Elastic.SpringDemo1.ivy.demo.HelloSpring">
 9           <!-- 給属性赋值 -->
10           <property name="meg" value="Spring IoC"></property>
11       </bean>
12 
13 </beans>


依赖注入--组件之间以配置文件的形式组织在一起,而不是以编码的方式耦合在一起
    1.设值注入 -- 属性的setter访问器
        可以使用p命名空间注入属性值
    2.构造注入 -- 带参构造方法
        1).技巧:编写带参构造方法,为保证使用的灵活性,建议添加无参构造方法    
        2).在Spring配置文件中通过<constructor-arg>元素为构造方法传参
            a.、一个<constructor-arg>元素表示构造方法的一个参数,且使用时不区分顺序。
            b.通过<constructor-arg>元素的index 属性可以指定该参数的位置索引,位置从0 开始。
            c.<constructor-arg>元素还提供了type 属性用来指定参数的类型,避免字符串和基本数据类型的混淆。

p命名空间:使用属性而不是子元素的形式配置Bean的属性
    1.引入p命名空间 xmlns:p="http://www.springframework.org/schema/p"
    
    2.对于直接量(基本数据类型、字符串)属性:p:属性名="属性值"
      对于引用Bean的属性:p:属性名-ref="Bean的id"

注入不同数据类型
    1.注入直接量            使用<value>标签;特殊字符的处理
    2.引用Bean                使用<ref>标签;注意bean属性和local属性的区别
    3.使用内部Bean            <property><bean>...</bean></property>
    4.注入集合类型的属性    <list>\\<set>\\<map>\\<props>标签
    5.注入null和空字符串值    使用<null>注入null值;使用<value>注入空字符串值
            
范例: 打印机
1.定义墨盒和纸张的接口标准
a.Ink接口

1 package com.Elastic.SpringDemo1.ivy.printer;
2 
3 /**
4  * 墨盒接口(墨盒规格)
5  *
6  */
7 public interface Ink {
8     String getColor();
9 }


b.Paper接口

1 package com.Elastic.SpringDemo1.ivy.printer;
2 
3 /**
4  * 纸张接口(纸张的规格)
5  *
6  */
7 public interface Paper {
8     void putChar(char c);
9 }


2.墨盒和纸张的接口的实现类
a.BlackInk类

 1 package com.Elastic.SpringDemo1.ivy.printer;
 2 
 3 public class BlackInk implements Ink{
 4 
 5     @Override
 6     public String getColor() {
 7         return "黑色";
 8     }
 9     
10 }


b.A4Paper类

 1 package com.Elastic.SpringDemo1.ivy.printer;
 2 
 3 public class A4Paper implements Paper{
 4 
 5     @Override
 6     public void putChar(char c) {
 7 
 8         System.out.print(c);
 9     }
10 
11 }


3.Printer类 -- 组装打印机

 1 package com.Elastic.SpringDemo1.ivy.printer;
 2 
 3 /**
 4  * 打印机
 5  *
 6  */
 7 public class Printer {
 8     Ink ink;
 9 
10     Paper paper;
11 
12     //属性增加setter方法
13     public void setInk(Ink ink) {
14         this.ink = ink;
15     }
16 
17     public void setPaper(Paper paper) {
18         this.paper = paper;
19     }
20 
21     public void print(String content) {
22         System.out.println("打印机正在打印:");
23         System.out.println("使用颜色:" + ink.getColor());
24         for (int i = 0; i < content.length(); i++) {
25             paper.putChar(content.charAt(i));
26         }
27 
28         System.out.println("打印完毕......");
29     }
30 
31 }


4.printerContext.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4        xsi:schemaLocation="http://www.springframework.org/schema/beans
 5            http://www.springframework.org/schema/beans/spring-beans.xsd">
 6 
 7     <!-- 由Spring的IoC容器创建对象 -->
 8       <bean id="blackPrinter" class="com.Elastic.SpringDemo1.ivy.printer.Printer">
 9           <!-- 給属性赋值(组装) -->
10           <property name="ink" ref="blackInk"></property>
11           <property name="paper" ref="A4"></property>
12       </bean>
13       
14       <bean id="blackInk" class="com.Elastic.SpringDemo1.ivy.printer.BlackInk"></bean>
15       
16       <bean id="A4" class="com.Elastic.SpringDemo1.ivy.printer.A4Paper"></bean>
17 
18 </beans>


5.Test类 -- 运行打印机

 1 package com.Elastic.SpringDemo1.ivy.test;
 2 
 3 import org.springframework.context.ApplicationContext;
 4 import org.springframework.context.support.ClassPathXmlApplicationContext;
 5 
 6 import com.Elastic.SpringDemo1.ivy.printer.Printer;
 7 
 8 public class Test {
 9 
10     public static void main(String[] args) {
11         //找到卖打印机的商店
12         //由Spring创建printer对象,并根据配置文件注入依赖的组件,完成组装
13         ApplicationContext context = new ClassPathXmlApplicationContext("printerContext.xml");
14         //給老板说来一台打印机
15         Printer printer = (Printer) context.getBean("blackPrinter");
16         printer.print("测试内容");
17     }
18 
19 }


范例:
1.实体类及其配置文件
a.User类

 1 package com.Elastic.SpringDemo1.ivy.entity;
 2 
 3 import java.io.Serializable;
 4 
 5 public class User implements Serializable{
 6     private String loginName;
 7     private String loginPass;
 8     
 9     public String getLoginName() {
10         return loginName;
11     }
12     public void setLoginName(String loginName) {
13         this.loginName = loginName;
14     }
15     public String getLoginPass() {
16         return loginPass;
17     }
18     public void setLoginPass(String loginPass) {
19         this.loginPass = loginPass;
20     }
21 }


b.User.hbm.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 4 <hibernate-mapping>
 5     <class name="com.Elastic.SpringDemo1.ivy.entity.User" table="user">
 6         <id name="loginName" type="java.lang.String">
 7             <column name="userName"></column>
 8             <generator class="assigned"></generator>
 9         </id>
10         <property name="loginPass" type="java.lang.String">
11             <column name="passWord"></column>
12         </property>
13     </class>
14 </hibernate-mapping>


2.hibernate.cfg.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 
 3 <!DOCTYPE hibernate-configuration PUBLIC
 4     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
 5     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
 6 
 7 <hibernate-configuration>
 8     <session-factory>
 9         <!-- 1.数据库连接信息 -->
10         <property name="connection.url">jdbc:mysql://localhost/hibernatedb</property>
11         <property name="connection.username">root</property>
12         <property name="connection.password">root</property>
13         <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
14         <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
15         <property name="show_sql">true</property>
16         <property name="format_sql">true</property>
17         
18                 
19         <!-- 2.使用c3p0连接池 -->
20         <property name="hibernate.connection.datasource">com.mchange.v2.c3p0.ComboPooledDataSource</property>
21         <property name="c3p0.max_size">100</property>
22         <property name="c3p0.min_size">10</property>
23         <property name="c3p0.acquire_increment">5</property>
24         <property name="c3p0.idle_test_period">60</property>
25         <property name="c3p0.timeout">10</property>
26         
27         <!-- 3.数据库对应的实体类的映射文件路径 -->
28         <mapping resource="com/Elastic/SpringDemo1/ivy/entity/User.hbm.xml"></mapping>
29     </session-factory>
30 </hibernate-configuration>


3.HibernateUtil类

 1 package com.Elastic.SpringDemo1.ivy.util;
 2 
 3 import org.hibernate.Session;
 4 import org.hibernate.SessionFactory;
 5 import org.hibernate.cfg.Configuration;
 6 public final class HibernateUtil {
 7     private static Configuration cfg = null;
 8     private static SessionFactory sessionFactory = null;
 9     
10     //本地线程
11     public static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
12     
13     static{
14         cfg = new Configuration().configure();
15         sessionFactory = cfg.buildSessionFactory();
16     }
17     
18     public static Session getSession(){
19         Session session = threadLocal.get();
20         if (null == session || !session.isOpen()) {
21             session = sessionFactory.openSession();
22             threadLocal.set(session);
23         }
24         return session;
25     }
26 }


4.dao包
a.IBaseDao接口

  1 package com.Elastic.SpringDemo1.ivy.dao;
  2 
  3 import java.io.Serializable;
  4 import java.util.List;
  5 import java.util.Map;
  6 
  7 import org.hibernate.Session;
  8 import org.hibernate.criterion.DetachedCriteria;
  9 public interface IBaseDao<T> {
 10     /**
 11      *
 12      * <p>
 13      * <h3>方法功能描述:获取Session对象</h3>
 14      * </p>
 15      * @return
 16      * @procedure 执行过程
 17      * @see IBaseDao
 18      */
 19     Session getSession();
 20     
 21     /**
 22      *
 23      * <p>
 24      * <h3>方法功能描述:保存数据</h3>
 25      * </p>
 26      * @param record    需要保存的对象
 27      * @procedure 执行过程
 28      * @see IBaseDao
 29      */
 30     void save(T record);
 31     
 32     /**
 33      *
 34      * <p>
 35      * <h3>方法功能描述:根据主键删除对应的数据</h3>
 36      * </p>
 37      * @param id
 38      * @procedure 执行过程
 39      * @see IBaseDao
 40      */
 41     //不明确id的类型,就用Serializable
 42     void delete(Serializable id);
 43     
 44     /**
 45      *
 46      * <p>
 47      * <h3>方法功能描述:根据数据对象删除数据库中对应的数据</h3>
 48      * </p>
 49      * @param record
 50      * @procedure 执行过程
 51      * @see IBaseDao
 52      */
 53     void delete(T record);
 54     
 55     /**
 56      *
 57      * <p>
 58      * <h3>方法功能描述:根据指定的对象修改对应的数据</h3>
 59      * </p>
 60      * @param record
 61      * @procedure 执行过程
 62      * @see IBaseDao
 63      */
 64     void update(T record);
 65     
 66     /**
 67      *
 68      * <p>
 69      * <h3>方法功能描述:根据主键查询对应的数据</h3>
 70      * </p>
 71      * @param id
 72      * @return 返回查找到的数据,如果没有返回null
 73      * @procedure 执行过程
 74      * @see IBaseDao
 75      */
 76     T findById(Serializable id);
 77     
 78     /**
 79      *
 80      * <p>
 81      * <h3>方法功能描述:根据指定的hql语句和参数查询语句</h3>
 82      * </p>
 83      * @param hql  需要执行的查询的HQL语句
 84      * @param params  执行的查询的HQL语句所需的参数,如果没有填写null
 85      * @return    返回查询数据的集合,如果出现异常返回null
 86      * @procedure 执行过程
 87      * @see IBaseDao
 88      */
 89     List<T> find(String hql,Map<String, Object> params);
 90     
 91     /**
 92      *
 93      * <p>
 94      * <h3>方法功能描述:根据指定的HQL语句和参数以及分页所需的数据执行查询</h3>
 95      * </p>
 96      * @param hql   需要执行的查询的HQL语句
 97      * @param pageIndex    需要查询的页数
 98      * @param pageSize    每页显示的数据条数
 99      * @param params    执行的查询的HQL语句所需的参数,如果没有填写null
100      * @return    返回分页查询的结果,是一个Map对象,该对象包含<blockquote>
101      *        <b>data</b>:查询结果的数据集合是一个List对象<br>
102      *         <b>pageIndex</b>:当前查询的页数<br>
103      *         <b>pageSize</b>:每页显示的数据条数<br>
104      *         <b>total</b>:数据的总条数<br>
105      *         <b>pageTotal</b>:数据的总页数<br>
106      *         <b>hasPrev</b>:是否有上一条数据<br>
107      *         <b>hasNext</b>:是否有下一条数据<br>
108      *         </blockquote>
109      * @procedure 执行过程
110      * @see IBaseDao
111      */
112     Map<String, Object> find(String hql, int pageIndex, int pageSize, Map<String, Object> params);
113     
114     /**
115      *
116      * <p>
117      * <h3>方法功能描述:分页查询数据</h3>
118      * </p>
119      * @param pageIndex    需要查询的页数
120      * @param pageSize    每页显示的数据条数
121      * @return    返回分页查询的结果,是一个Map对象,该对象包含<blockquote>
122      *        <b>data</b>:查询结果的数据集合是一个List对象<br>
123      *         <b>pageIndex</b>:当前查询的页数<br>
124      *         <b>pageSize</b>:每页显示的数据条数<br>
125      *         <b>total</b>:数据的总条数<br>
126      *         <b>pageTotal</b>:数据的总页数<br>
127 Spring boot:thymeleaf 没有正确渲染片段

What's the difference between @Component, @Repository & @Service annotations in Spring?(代码片段

spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段

Spring Rest 文档。片段生成时 UTF-8 中间字节无效 [重复]

解决spring-boot启动中碰到的问题:Cannot determine embedded database driver class for database type NONE(转)(代码片段

一张图帮你记忆,Spring Boot 应用在启动阶段执行代码的几种方式