目录
- 1、spring
- 1.1 spring起源:
- 1.2 spring定义(什么是spring)(官网: http://spring.io/ )
- 1.3 Spring好处
- 1.4 spring装配Bean/实例化Bean的方式
- 1.5 FactoryBean和BeanFactory的区别
- 1.6 IOC、DI
- 1.7 IOC和DI的区别
- 1.8 IOC容器的作用
- 1.9 ClassPathXmlApplicationContext的三种路径方式
- 1.10 bean的命名方式
- 1.11 bean的作用域
- 1.12 bean属性依赖注入的简单方式
- 1.13 bean属性依赖注入复杂数据类型
- 1.14 注解扫描
- 1.15 AOP编程三步曲
- 1.16 Aop术语
- 1.17 AOP事务(配置切面,配置增强)
- 1.18 bean在applicationContext的生命周期
1、spring
1.1 spring起源:
早期使用java开发企业应用(企业应用系统,比如:人力资源管理系统、OA办公自动化系统、财务系统 ,所有企业应用的系统总称为ERP)使用EJB(Enterprise java Bean)开发,是sun提供的规范,比如:把javabean分为:Bean(Session Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDriven Bean)。
EJB特点依赖于应用服务器(比如:weblogic、websphere,类似 于tomcat),在开发EJb程序时过程比较繁琐。
Spring的出现是为了取代EJB的臃肿、低效、脱离现实缺点。Spring致力于J2EE应用的各层的解决方案,而不是仅仅专注于某一层的方案。可以说Spring是企业应用开发的“一站式”选择,并贯穿表现层、业务层及持久层。然而,Spring并不想取代那些已有的框架,而是与它们无缝地整合。
1.2 spring定义(什么是spring)(官网: http://spring.io/ )
Spring是分层的JavaSE/EE应用一站式的轻量级开源框架。以Ioc(Inverse of control)控制反转和Aop(Aspect Oriented Programming)面向切面编程为核心 。
分层:
web层
web层:spring MVC框架(类似 struts2,是一个mvc框架),提供和其它web层整合方案;
业务层
业务层:声明式事务管理方式、任务调度;
持久层
持久层:jdbc模版开发工具包、和其它持久层hibernate框架整合方案;
上边各层以IOC和AOP作为基础。
一站式:
spring提供各层的解决方案。
轻量级:
相对于EJB来说,好用,简单、方便,spring不依赖应用服务器(weblogic)。
开源框架:
纯java开源框架;
整合众多开源框架;
和Struts2 表现层框架整合;
和Hibernate 持久层框架整合;
和Ibatis、Mybatis持久层框架整合 ;
1.3 Spring好处
1.方便解耦,简化开发:
Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理
2.AOP编程的支持:
Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能
3.声明式事务的支持:
只需要通过配置就可以完成对事务的管理,而无需手动编程
4.方便程序的测试:
Spring对Junit4支持,可以通过注解方便的测试Spring程序
5.方便集成各种优秀框架:
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持
6.降低JavaEE API的使用难度:
Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。
1.4 spring装配Bean/实例化Bean的方式
1.4.1 applicationContext.xml方式:
在xml当中配置一个bean,然后写一个入口测试一下
1.4.2 注解方式:
用到的注解有:@Component,@Repository,@Service,@Controller
然后在配置文件里添加注解扫描。
1.4.3 javaBean的方式:
声明一个java类,类上加@Configuration,如果是springboot项目,类上加@SpringBootConfiguration,
方法上加@Bean这个注解:
1.5 FactoryBean和BeanFactory的区别
FactoryBean,是一个特殊Bean,可以生产另一个bean。
BeanFactory,是一个工厂,可以生产任意bean。
1.6 IOC、DI
不使用IOC对象之间调用,存在耦合问题;
如果使用IOC思想,将iOC当成一个容器,对象要调用另一个对象时,通过iOC容器来调用,
引用iOC,iOC是Inversion of Control的缩写,翻译成“控制反转”;
IOC定义:
将原来程序中自己创建实现类对象的控制权反转到iOC容器中,程序只需要从iOC容器获取创建好的对象;
iOC容器相当于一个工厂;
DI:
所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。
1.7 IOC和DI的区别
iOC和 DI 描述的是同一件事 ;
iOC强调 将对象的创建权,被反转到IoC 容器;
DI 强调 iOC容器将对象的依赖关系,动态注入到对象之中 ,DI是控制反转具体的实现过程。
1.8 IOC容器的作用
1、将bean配置在applicationContext.xml中,IOC容器在构建时自动创建bean实例(相当于new 对象)
2、将bean所依赖的bean配置在applicationContext.xml中,IOC容器自动将bean所依赖的对象注入进去。
1.9 ClassPathXmlApplicationContext的三种路径方式
两个xml传入另一个xml中:import
1.10 bean的命名方式
1.id
2.name
1)name引号里的值不能重复,
2) name可以定义多个用逗号隔开,
3)获取任意name即可获取bean
3.匿名
没有名称,自定义的获取需要的全限定名
<bean class="pojo.Person"></bean>
1.11 bean的作用域
1.singleton
单例 默认使用单例,不存数据共享用单例,单例就创建一个实例 ;
<bean id="dan" class="pojo.Person" scope="singleton"></bean>
2.prototype
多例 存在数据共享用多例,多例每次都会创建一个实例;
<bean id="duo" class="pojo.Person" scope="prototype"></bean>
1.12 bean属性依赖注入的简单方式
1.构造注入:标签,index指bean中方法的参数下标.
2.set方法注入:
<property></property>
1)简单方式:
2)p命名空间简化属性依赖注入之setter方法:
在实现p命名空间之前,要先导入p标签的约束:
web层:
service层:
1.13 bean属性依赖注入复杂数据类型
1.数组:private String[] arr;
<bean id="user" class="pojo.User">
<property name="userName" value="李钰迪">
</property>
</bean>
<bean id="user1" class="pojo.User">
<property name="userName" value="王小曼">
</property>
</bean>
<bean id="userVo" class="pojo.UserVo">
<!-- 数组注入 -->
<property name="arr">
<array>
<value>刘小姐</value>
<value>黄小姐</value>
<value>陈小姐</value>
</array>
</property>
2.list简单类型集合:private List list;
<!-- list 简单类型 -->
<property name="list">
<list>
<value>马老师</value>
<value>程老师</value>
<value>孙老师</value>
</list>
</property>
3.list对象类型集合:private List list1;
<!-- list-pojo -->
<property name="list1">
<list>
<ref bean="user"/>
<ref bean="user1"/>
</list>
</property>
4.set简单类型:private Set setString;
<!-- set 可去重-->
<property name="setString">
<set>
<value>陈静仪</value>
<value>陈静仪1</value>
<value>陈静仪2</value>
</set>
</property>
5.map集合形式 key value 形式:private Map<String,Object> map;
<!-- map -->
<property name="map">
<map>
<entry key="username" value="王铭">
</entry>
<entry key="username1" value="王龙">
</entry>
<entry key="username2" value="王亚峰">
</entry>
<entry key="user1" value-ref="user1" >
</entry>
</map>
</property>
6.Properties key value 形式:private Properties properties;
<!-- Properties -->
<property name="properties">
<props>
<prop key="username">史学峰</prop>
<prop key="password">123456</prop>
</props>
</property>
</bean>
Properties properties = vo.getProperties();
System.out.println(properties.get("username5")+","
+properties.get("password"));
1.14 注解扫描
@Component:
使用构造 方法实例化,使用@Component,在class上使用@Component标识这个是一个bean,用spring的IOC容器管理。
使用流程:
1、在class上使用@Component标记
2、配置组件扫描器
配置组件扫描器,spring会根据配置的扫描的包路径,去扫描包下的class,如果遇到@component,去管理这个 bean。
使用spring可以应用在三层(web层、业务层、持久层),spring提供三个对应三层bean的注解:
web层:@Controller (表示一个控制器)
业务层:@Service (表示一个业务bean)
持久层:@Repository(表示一个持久层的dao)
如果遇到无法确定属于哪一层的bean 使用@Component
以上三个注解和Component完全 等价的。
@Autowired:
基于类型注入,可以设置属性上或set方法上,不需要指定将哪个bean的id注入
@autowried和@resource的区别(重点)
都可以完成属性注入,autowried是 spring提供的,resource是javaEE规范,如果系统的bean只有一个类型,可以使用autowired,如果bean有多个类型,需要autowired和qualifier结合使用为了系统和spring解耦合,建议使用resource,因为resource是jdk的规范。
@Scope(singleton或prototype)
@Scope(“prototype”)//多例 多例时销毁方法不会执行
@Scope(“singleton”)//单例时销毁方法会执行
annotation-config和component-scan区别
1.context:annotation-config/
将在配置文件中添加context:annotation-config标签使@Resource、@ PostConstruct、@ PreDestroy、@Autowired注解生效
context:annotation-config只针对容器中已经存在bean。
2.<context:component-scan base-package=“bgs.com.spring”>
除了具有<context:annotation-config />的功能之外,还具有自动将带有@component,@service,@Repository等注解的对象注册到spring容器中的功能。如果使用了context:component-scan所以可以去掉context:annotation-config。
@PostConstruct:bean的初始化
@PreDestroy:bean的销毁
1.15 AOP编程三步曲
1、确定目标对象 Target
orderServiceImpl
2、编写增强 Advice
代理对象的执行逻辑,比如:开启事务、提交事务
3、定义切面 Aspect
包括切入点(切点)和增强。
定义切面的好处:一个切面或以包括多个切点和增强。
1.16 Aop术语
1 Joinpoint(连接点):
2 Pointcut(切入点):
3 Advice(增强/通知):
4 Target(目标对象):
5 Introduction(引介):
6 Weaving(织入):
创建代理对象的过程,将增强代码织入到目标对象上
7 Proxy(代理):
就是一个代理对象
8 Aspect(切面):
1.17 AOP事务(配置切面,配置增强)
1.18 bean在applicationContext的生命周期
<bean id="per" class="pojo.Person" init-method="setUp" destroy-method="tearDown"></bean>
定义容器的后处理:
<bean class="pojo.CustomPostPro"></bean>
bean:bean对象;name:bean的名称;
测试BeanPostProcessor后处理器:
销毁bean: