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,你可以方便的与其他框架进行集成,如hibernate
,ibatis,structs
等,Spring官方的原则是绝不重复造轮子,有好的解决方案只需要通过Spring进行集成即可。Spring Framework 本身并未提供太多具体的功能,它主要专注于让你的项目代码组织更加优雅,使其具有极好的灵活性和扩展性,同时又能通过Spring集成业界优秀的解决方案
Inversion of Control(控制反转/Dependency Inversion Principle):
1.一个重要的面向对象编程的法则来削减计算机程序的耦合问题
2.轻量级的Spring框架的核心
IoC负责什么?
- 创建对象
- 管理对象(通过依赖注入DI)
- 装配对象
- 配置对象
- 管理对象生命周期
实现技术:
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(转)(代码片段