框架
生活中框架
买房:买房子(装修后入住-半成品
手抓饼(食品半成品)
程序中框架
代码半成品
- spring(万能-一站式)
- controller:springMVC
- dao:jdbcTemplate->data系列
- service:事务
- …
- springMVC:Servlet(Controller|Handler)
- mybatis:Dao(Dao|jdbc)
- 以前:SSH(Spring+Struts2+Hibernate)->SSM(Spring+SpringMVC+Mybatis)
spring 框架简介
- Spring官网:http://spring.io
- Spring是一个开源框架
- Spring是一个IOC(DI)和AOP容器框架。
- Spring特性
- 一站式:Spring可以解决层的问题
- 非侵入式:使用Spring框架,无需直接继承类(实现接口)
- Servlet侵入式:继承HttpServlet 或 实现Servlet
- 组件化:即插即用
- 依赖注入:IOC|DI
- 面向切面:AOP
- …
搭建框架思路
- 导入相关jar包(添加依赖)
- 编写核心配置文件:xxx.xml
- 使用核心类库
搭建spring框架(spring helloworld)
导入5个jar包(后期及其简化-maven
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELE2ASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
commons-logging-1.1.1.jar
编写核心配置文件
配置文件名字:任意编写,建议:applicationContext.xml | beans.xml
配置文件位置:类路径下(类似src路径,新建source folder类型的conf)
IDEA支持spring框架。只要添加指定jar包后,会出现Spirng Config的xml文件提示。
编写POJO类(bean-Student)
测试(使用核心类库-ApplicationContext容器对象)
spring IOC&AOP
IOC
- IOC(Inversion of Control):反转控制 | 控制反转
- 反转对象的控制权利及获取方式
- 传统方式: 我想吃饭 我需要买菜做饭
- 反转控制: 我想吃饭 饭来张口
- IOC具体在spring中的实现
* BeanFactory:一般程序员不会用到,为spring底层提供的。
* ApplicationContext:程序员使用
* FileSystemXmlApplicationContext(实现类):基于系统路径,获取资源文件,不推荐使用
* ClassPathXmlApplicationContext(实现类):基于类路径,获取资源文件,推荐使用
* ConfigurableApplicationContext(子接口):可以刷新关闭上下文对象。(ApplicationContext
DI(Dependency Injection):依赖注入
AOP
bean标签简介
bean标签基本用法:管理POJO
bean标签属性
- id:bean唯一标识
- name:bean标识(不唯一,不建议使用)
- class:管理POJO的全类名
反射原理,通过类全名,获取对象。
Class clz = Class.forName("com.atguigu.bean.Student");
Student stu = clz.newInstance();
bean标签子标签property(管理POJO中的属性
- 属性
name:指定对象的属性名
value:设置字面量属性值
ref:设置(非字面量)引入外部bean
getBean()的三种方式
- getBean(Class clz); 不足:如果容器装配了多个bean对象,会报错。
- getBean(String beanId); 不足:默认返回Object类型
- getBean(String beanId,Class clz):推荐使用
依赖注入方式
JavaSE:为对象中属性赋值的方式哪些?
- 构造器
- setXXX()
- 反射(略
Spring注入方式之Set注入
- 通过bean标签的子标签实现
eg:
<property name="xxx" value="10001"></property>
Spring注入方式之构造器注入
- 通过bean标签中的子标签实现
eg:
<constructor-arg name="id" value="1001"></constructor-arg>
P名称空间注入方式,本质是Set注入
- 通过bean标签中p:属性实现
eg:
<bean id="bookP" class="com.atguigu.springdemo.ioc.Book" p:id="1006">
依赖注入值介绍
字面量
- 语法结构:基本数据类型及其封装类、String.
- 使用角度:value属性或value标签中可以书写的值
- 注意:如果解决字面量值的特殊字符问题?
JavaWeb中:实体字符,转义字符,如:< > ©等等
使用<![CDATA[指定字符]]>区
引入外部已声明bean
级联属性赋值
<bean id="deptOne" class="com.atguigu.springdemo.ioc.Dept">
<property name="id" value="10001"></property>
<property name="name" value="研发部"></property>
</bean>
<bean id="empM" class="com.atguigu.springdemo.ioc.Emp">
<property name="dept" ref="deptOne"></property>
<!-- 给bean的级联属性赋值 -->
<property name="dept.name" value="教务部门"></property>
</bean>
内部bean
- 内部类:在一个类中,完整定义了另一个类。
- 内部bean:在一个bean中,完整定义了另一个bean.
<bean id="empM2" class="com.atguigu.springdemo.ioc.Emp">
<property name="dept">
<bean id="deptTwo" class="com.atguigu.springdemo.ioc.Dept">
<property name="id" value="10002"></property>
<property name="name" value="财务部"></property>
</bean>
</property>
</bean>
集合类型
List Set|Array
<bean id="dept3" class="com.atguigu.springdemo.ioc.Dept">
<property name="list">
<list>
<ref bean="empSet"/>
<ref bean="empCon"/>
</list>
</property>
</bean>
Map
<bean id="dept4" class="com.atguigu.springdemo.ioc.Dept">
<property name="map">
<map>
<entry key="chailaoshi" value-ref="empSet"></entry>
<entry key="chenlaoshi" value-ref="empCon"></entry>
</map>
</property>
</bean>
提取集合类型的bean(需要引入util名称空间)
<util:list id="listEmp">
<ref bean="empSet"/>
<ref bean="empCon"/>
</util:list>
<bean id="dept3" class="com.atguigu.springdemo.ioc.Dept">
<property name="list" ref="listEmp"></property>
</bean>