概述
开源/轻量级/分层式/一站式full-statck框架
一站式:为三层架构(UIL,BLL,DAL)的每一层都提供了解决问题的全家桶技术
表示(界面)层:SpringMVC
业务层:SpringIoC
数据访问层:Spring jdbcTemplate
核心
1.AOP Aspect Oriented Programming
面向切面,扩展功能
2.IoC Inversion of Control
控制反转,创建对象由Spring进行配置文件,然后通过反射创建对象.
包括:
依赖注入DI Dependency Injection(需要在IoC的基础上完成)
依赖查找DL Dependency Lookup
版本
Spring4.x
SpringIoC
bean管理:1.配置文件 2.注解
IoC底层原理
1.xml配置文件
2.dom4j解决xml*
3.工厂设计模式
4.反射创建对象
原来:高耦合
servlet中
User user = new User();
user.method();
后来:工厂模式(工厂和serlvet还有耦合)
sevlet中
User user = UserFactory.getUser();
user.method();
再后来:IoC
1.创建一个配置文件
<bean id=”user” class=”xxx.User”></bean>
2.创建工厂类
使用dom4j解析xml*
使用反射创建对象
Class clazz = Class.forName(“class的路径”);
User u = clazz.getDxxConstuctor.newInsatnce();
3.使用工厂类得到User
User user = UserFactory.getUser();
user.method();
简单步骤
1.导jar包
docs:该文件夹下包含Spring的相关文档、开发指南及API参考文档;
dist:该文件夹下包含Spring jar包、文档、项目等内容;
lib里面是jar包,每个文件有三种,jar包,文档,源代码
只需要4个核心jar包即可 core,bean,context,expesion
还需要日志包logging,log4j
commons-logging-1.1.3.jar
log4j-1.2.17.jar
schema:里面包含了Spring4所用到的xsd文件;
2.创建类,接口
3.xml文件
(1)src下面ApplicationContext.xml
位置和文件都不固定
(2)引入schema约束(不再是dtd约束)
docs/xx-references/html/
Appendix 下面. XML Schemas
找到说明文档Api,找到XML Schemas里面有beans跟标签的约束
没有网的情况下,没有提示:
*1.复制约束路径
*2.在xmlCatalog中Add,key中放入刚才复制的路径
*3.location中按照路径放入约束文件,使用最高版本,keyType选SchemlLocation
(3)配置对象
4.测试即可
Bean实例化的方式
1.无参构造
<bean id=”user” class=”xxx.User”></bean>
2.静态工厂
<bean id=”” class=”工厂路径” factory-method=”getUserBean” />
3.实例工厂
<bean id=”beanFactory” class=”工厂路径” />
<bean id=”bean3” factory-bean=”beanFactory” factory-method=”getBean” />
Bean标签的常用属性
id 不能加下划线等特殊符号
class 全路径
name 和id功能一样,name可以包含特殊符号#_(不常用了,遗留)
scope singleton,默认值
prototype,多实例
request,放到request域
session,session域
globaSession,globalSession域,单点登陆用
factory-bean
factory-method
注:spring的bean管理单例模式是基于ApplicationContext的,如果application关闭了,那么就不是相同的对象了
例如:
public static void main(String[] args) {
UserBean user1 = (UserBean) SpringUtil.getBean("userBean");
user1.setUserId(98);
UserBean user2 = (UserBean) SpringUtil.getBean("userBean");
System.out.println(user2.getUserId());//98
}
属性注入
Java中依赖注入的三种方式:
1.构造器
2.set
3.接口注入(接口中有属性,有一个设置属性的方法)
@org.junit.Test
public void test2() {
String path = "com.luhao.test.ClassA1";
try {
IClassA a = (IClassA) Class.forName(path).getDeclaredConstructor().newInstance();
a.setA("接口设置属性");
System.out.println(a.getA());
} catch (Exception e) {
e.printStackTrace();
}
}
Spring:
1.set注入(重要)
2.构造器注入
3.不支持接口注入
4.p名称空间注入(可以区分属性)
需要导入引用
xmlns:p="http://www.springframework.org/schema/p "
在bean中加入p:属性名="value"
constructor-arg 构造器
property 属性
ref 引用,对象类型属性
属性注入复杂类型
1.数组
2.list集合
3.map集合
4.propertie类型
<bean id="testBean" class="com.luhao.bean.TestBean">
<property name="id" value="1"></property>
<property name="arr">
<list>
<value>1</value>
<value>2</value>
</list>
</property>
<property name="list">
<list>
<value>3</value>
<value>4</value>
</list>
</property>
<property name="map">
<map>
<entry key="123" value="123"></entry>
<entry key="321" value="321"></entry>
<entry key="1234567" value="1234567"></entry>
</map>
</property>
<property name="properties">
<props>
<prop key="user">root</prop>
<prop key="password">luhao123</prop>
<prop key="name">luhao</prop>
</props>
</property>
</bean>
Spring整合Web项目原理
1.加载Spring核心配置文件
ApplicationContext context = new ClassPathXMLApplicationContext(Path);
new对象,功能可以实现,但是效率很低
2.思想:把加载配置文件和创建对象的过程的压力交给服务器
3.实现原理
使用ServletContext监听器来监听ServletContext的创建
- 在服务器启动的时候为每个项目创建ServletContext
- 监听到ServletContext创建的时候加载Spring配置文件,并创建对象
- 把创建出来的对象放到ServletContext域中
SpringBean管理 注解
注解:代码里面的特殊标记
@注解名称(属性名称=”属性值”)
可以使用在类上面,方法上面,属性上面
注解不可能完全脱离配置文件
1.注解:jar包 aop包...
2.约束:找Appendix 里面的 XML Schemas里面的 The context schema
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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">
</beans>
3.开启注解扫描
<context:component-scan base-package="包名"></con...>
包名可以写逗号,还可以写通配符
<context:component-scan base-package="com.luhao"></context:component-scan>
4.注解创建对象
@Component(value="user") value可以省略
=<bean id="user" class="xx" />
Commponent/Controller/Service/Respository
这四个注解的功能是一样的,Spring在后续版本会对其进行增强
(单实例还是多实例,在类上面再加一个@Scope(vlaue="prototype"))
5.注入属性
@Autowired(自动装配),和注入的属性的类中component的value无关,根据类名自动找类
@Resource(name="类中的注解的value") 常用的
配置文件和注解混合使用
- 1.创建对象一般使用配置文件 IoC
2.注入属性一般使用注解 DI*
Util.Test找错小技巧
从Caused By 找错误信息