[转载]Spring框架总结

 1.IOC和DI

IOC: 控制反转
即控制权的转移,将我们创建对象的方式反转了,以前对象的创建是由我们开发人员自己维护,包括依赖关系也是自己注入。使用了spring之后,对象的创建以及依赖关系可以由spring完成创建以及注入,反转控制就是反转了对象的创建方式,从我们自己创建反转给了程序创建(spring)

DI:  Dependency Injection  依赖注入
spring这个容器中,替你管理着一系列的类,前提是你需要将这些类交给spring容器进行管理,然后在你需要的时候,不是自己去定义,而是直接向spring容器索取,当spring容器知道你的需求之后,就会去它所管理的组件中进行查找,然后直接给你所需要的组件.
实现IOC思想需要DI做支持
注入方式:   1.set方式注入    2.构造方法注入   3.字段注入
注入类型:   1.值类型注入      2.引用类型注入

好处: 

1.降低组件之间的耦合度,实现软件各层之间的解耦.


2.可以使容器提供众多服务如事务管理消息服务处理等等。当我们使用容器管理事务时,开发人员就不需要手工控制事务,也不需要处理复杂的事务传播


3.容器提供单例模式支持,开发人员不需要自己编写实现代码.


4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能


5.容器提供众多的辅佐类,使这些类可以加快应用的开发.如jdbcTemplate HibernateTemplate

2.applicationContext & BeanFactory区别

BeanFactory接口(老版本工厂类)
(1) spring的原始接口,针对原始接口的实现类功能较为单一
(2)BeanFactory接口实现类的容器,特点是每次在获得对象时才会创建对象

ApplicationContext接口(新版本工厂类)
(1)每次容器启动时就会创建容器中配置的所有对象
(2)提供了更多功能
(3)ApplicationContext有两个实现类

    1.从类路径下加载配置文件: ClassPathXmlApplicationContext
    2.从硬盘的绝对路径下加载配置文件:FileSystemXmlApplication

3.spring配置详解

3.1、元素属性

    bean元素:使用该元素描述需要spring容器管理对象
    name属性:给被管理的对象起个名字,获得对象时getBean("name值")
    class属性:被管理对象的完整类名
    id属性:与name属性一模一样,名称不可重复,不能使用特殊字符

name和id之间的一些注意点:
1、配置两个相同的 id 或者 name 都不能通过。
2、如果既配置了 id ,也配置了 name ,则两个都生效。如果id和name都没有指定,则用类全名作为name,如<bean class="com.stamen.BeanLifeCycleImpl">,则你可以通过getBean("com.stamen.BeanLifeCycleImpl")返回该实例。
3、如果配置基本类的时候,注解和配置文件都使用的时候,注解和配置文件中 name 相同的时候, 则两个冲突,配置文件生效。
      如果配置基本类的时候,注解和配置文件都使用的时候,注解和配置文件中 name 不相同的时候, 则两个不冲突,都能够生效。

3.2、bean元素进阶(  scope属性   生命周期属性)—————单例多例

(1)scope属性
(1)singleton   默认值   
单例对象   :被标识为单例的对象在spring容器中只会存在一个实例
(2)prototype    
多例原型:被标识为多例的对象,每次在获得才会被创建,每次创建都是新的对象
(3)request
应用在web项目中,Spring创建这个类以后,将这个类存入到request范围中。   
(4)session
应用在web项目中,Spring创建这个类以后,将这个类存入到session范围中。

(5)globalsession :应用在web项目中,必须在porlet环境下使用。但是如果没有这种环境,相对于session。
总结:绝大多数情况下,使用单例singleton(默认值),但是在与struts整合时候,务必要用prototype多例,因为struts2在每次请求都会创建一个新的Action,若为单例,在多请求情况下,每个请求找找spring拿的都是同一个action。

(2)生命周期属性(了解)———初始化和销毁
    (1)配置一个方法作为生命周期初始化方法,spring会在对象创建之后立刻调用 init-method
    (2)配置一个方法作为生命周期的销毁方法,spring容器在关闭并销毁所有容器中的对象之前调用destory-method
    <bean init-method=“init”  destory-method=“destory”></bean>        对应注解为@PostConstruct

    <bean name=“hello” class=“完整类名”></bean>                                 对应注解为@PreDestory

(3)模块化配置,即分模块配置(导入其他spring配置文件)
<beans>
    <import resource = “spring配置文件的全路径名” />
</beans>

3.3、spring三种对象的创建方式

(1)空参数构造(重要)

(2)静态工厂创建(调用静态方法创建)
调用UserFactory类的静态createUser方法创建名为user的对象,放入容器

<bean name="user" class="cn.itcats.UserFactory" factory-method="createUser"></bean>

(3)实例工厂创建(调用非静态方法创建)——需要配置两个bean,因为无法通过类名调用非静态方法

<bean name="user2" factory-bean="userFactory" factory-method="createUser"></bean>
 
<bean name=“userFactory” class=“cn.itcats.UserFactory”></bean>

3.4、spring注入方式

(1)set方式注入(重点)————值类型用value注入    引用类型用ref注入

Set方法的普通属性注入
property 标签用于配置Set方法的属性注入
name :参数的名称
value:设置普通数据
ref:引用数据,一般是另一个bean id值

(2)构造方法注入

构造方法的属性注入
constructor-arg 标签用于配置构造方法的属性注入
name :参数的名称
value:设置普通数据
ref:引用数据,一般是另一个bean id值

当然了,构造方法的方式的属性注入也支持对象属性的注入,标签中对应属性也是ref
如果只有一个有参数的构造方法并且参数类型与注入的bean类型匹配,那就会注入到该构造方法中

函数注入
(3)p名称空间注入———实际上set注入,spring特有,为了简化<property>写法

   1、applicationContext.xml中<beans>标签头部导入p命名空间

xmlns:p="http://www.springframework.org/schema/p"

 2、书写格式:值类型注入——  p:属性名="值"      引用类型注入——  p:属性名-ref="引用的<bean> name属性"

       把Run类中的name属性值设置为haha,age属性设置为20,引用属性hello引用<bean name="hello" class="..."></bean>

<bean name="run2" class="cn.itcats.thread.Run" p:name="haha" p:age="20" p:hello-ref="hello"></bean>

(4)spel注入: spring Expression Language spring表达式语言

<bean name="runSpel" class="cn.itcats.thread.Run">
    <!-- 取bean标签中name为"user"中property为"name"中的value值 --!>
    <property name="name" value="#{user.name}"></property>
</bean>

SpEL特性:(1)、使用Bean的ID来引用Bean;(2)、调用方法和访问对象的属性;(3)、对值进行算术、关系和逻辑运算;(4)、正则表达式匹配;(5)、集合操作

关于spel   https://www.cnblogs.com/goodcheap/p/6490896.html

复杂类型注入

1.array数组的注入

2.list集合的注入

 3.map集合的注入

 4.properties的注入

4、防止创建多个applicationContext取值/并指定记载spring配置文件的位置——web.xml

   1、需要导入包spring-web
   2、在web.xml中配置监听器

5、使用注解方式代替配置文件(官方推荐使用注解)

1.在applicationContext.xml中书写指定扫描注解

 2.在类中书写Component

注意:假如不写括号内的值(即name或id),默认使用类名首字母小写作为搜索,为什么意思呢?

比如Student类中使用了@Component   没有书写括号和值,那么默认搜索id或name为student。

衍生:
@Controller Web层
@Service 业务层
@Repository 持久层
这三个注解是为了让标注类本身的用途清晰

属性注入的注解 ( 可以没有set方法
普通类型属性:@Value

对象类型属性:@Resource (对应bean中的id)= @Autowired(类型)+ @Qualifier(名称)

3.指定对象的作用范围Scope

 声明Student类对象为多例       下面是对singleton和prototype的一些补充

singleton作用域:当把一个Bean定义设置为singleton作用域是,Spring IoC容器中只会存在一个共享的Bean实例,并且所有对Bean的请求,只要id与该Bean定义相匹配,则只会返回该Bean的同一实例。值得强调的是singleton作用域是Spring中的缺省作用域。

prototype作用域:prototype作用域的Bean会导致在每次对该Bean请求(将其注入到另一个Bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的Bean实例。根据经验,对有状态的Bean应使用prototype作用域,而对无状态的Bean则应该使用singleton作用域。对于具有prototype作用域的Bean,有一点很重要,即Spring不能对该Bean的整个生命周期负责。具有prototype作用域的Bean创建后交由调用者负责销毁对象回收资源。简单的说:

singleton 只有一个实例,也即是单例模式。

prototype访问一次创建一个实例,相当于new。

4.值类型的注入

实际通过反射field赋值

实际通过set方式赋值

5.引用类型的注入

面试题: @AutoWired和@Resource的区别?

@AutoWired默认以类型进行查找,@Resource默认以名称进行查找

@AutoWired(required=false)    +   @Qualifier("user")    ==   @Resource(name="user")

其中@Resource注解是jdk1.6后才有的

6.创建与销毁方法

 7.spring整合junit测试(spring创建容器)

 @RunWith(SpringJUnit4ClassRunner.class)
 @ContextConfiguration("classpath:applicationContext.xml")    

6、spring中AOP名词解释

JoinPoint(连接点):目标对象中,所有可以增强的方法,就是spring允许你是通知(Advice)的地方,那可就真多了,基本每个方法的前、后(两者都有也行),或抛出异常是时都可以是连接点,spring只支持方法连接点。


Pointcut(切入点):目标对象中,已经被增强的方法。调用这几个方法之前、之后或者抛出异常时干点什么,那么就用切入点来定义这几个方法。


Advice(通知/增强) :增强方法的代码、想要的功能。


Target(目标对象):被代理对象,被通知的对象,被增强的类对象。


Weaving(织入):将通知应用到连接点形成切入点的过程


Proxy(代理):将通知织入到目标对象之后形成的代理对象


aspect(切面):切入点+通知————通知(Advice)说明了干什么的内容(即方法体代码)和什么时候干(什么时候通过方法名中的before,after,around等就能知道),二切入点说明了在哪干(指定到底是哪个方法),切点表达式等定义。

虽然现在都用Maven项目构建,但是不能忘记,使用aop需要用到的包:spring-aop + spring-aspects + springsource.org.aopalliance + springsource.org.aspectj.weaver 

关于AOP看一个小例子:看原文

7、spring中的aop使用注解配置

 1、applicationContext.xml中配置目标对象,通知对象,开启使用注解完成织入

8、spring整合jdbc

9、spring中的aop事务

————————————————
版权声明:本文为CSDN博主「itcats_cn」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/itcats_cn/article/details/81479185

猜你喜欢

转载自www.cnblogs.com/doyi111/p/11823035.html
今日推荐