Spring框架

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:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值