spring
·简介
Spring : 春天 —>给软件行业带来了春天
2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架。
2004年3月24日,Spring框架以interface21框架为基础,经过重新设计,发布了1.0正式版。
Spring理念 : 使现有技术更加实用 . 本身就是一个大杂烩 , 整合现有的框架技术
官网 : http://spring.io/
官方下载地址 : https://repo.spring.io/libs-release-local/org/springframework/spring/
GitHub : https://github.com/spring-projects
·优点
1、Spring是一个开源免费的框架 , 容器
2、Spring是一个轻量级的框架 , 非侵入式的
3、控制反转 IoC , 面向切面 Aop
4、对事物的支持 , 对框架的支持
…
总而言之一句话概括:
Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器(框架)。
- IOC(控制反转)
IOC—Inversion of Control,即“控制反转”,是一种设计思想。
在Java开发中,Ioc意味着将我们设计好的对象交给容器控制
而不是传统的在我们的对象内部直接控制.
- DI(依赖注入)
DI—Dependency Injection,即“依赖注入”:是IOC的一种实现方式
类之间依赖关系由容器在运行期决定
形象的说,即由容器动态的将某个依赖关系注入到类之中
IOC和DI的区别:
IOC | DI |
---|---|
控制反转是从容器的角度在描述,描述完整点就是:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源 | 依赖注入是从应用程序的角度在描述,可以把依赖注入描述完整点:应用程序依赖容器创建并注入它所需要的外部资源 |
使用配置文件方式给属性赋值时,调用的是属性的set方法
Bean标签
- bean标签是用来把一个对象放在spring容器中,id是作为此对象的唯一标识,class中填入的是类的全类名,scope属性标识此对象是否是单例模式对象,prototype是非单例模式,默认是单例模式
- property标签用来给对象的属性进行赋值,name是属性名称,value是属性值,ref是用来给对象类型属性赋值,填入的是对象的id。
- Bean标签中的lazy-init属性是设置此对象是否为懒加载,
如果为true则在容器启动时(加载配置文件时)不会创建对象,而是在获取对象时创建。
如果为false则在容器启动时创建对象
使用spring注入List集合
1. <property name="computer" >
2. <list>
3. <ref bean="com1"/>
4. <ref bean="com2"/>
5. <ref bean="com3"/>
6. </list>
7. </property>
使用spring注入set集合
1. <property name="balls">
2. <set>
3. <value>足球</value>
4. <value>蓝球</value>
5. <value>乒乓球</value>
6. </set>
7. </property>
使用spring注入数组属性
1. <property name="friends">
2. <array>
3. <value>张三</value>
4. <value>李四</value>
5. <value>王五</value>
6. </array>
7. </property>
使用spring注入Map集合
- <property name="keys">
- <map >
- <entry key="key1" value="第一个值"></entry>
- <entry key="key2" value="第二个值"></entry>
- <entry key="key3" value="第三个值"></entry>
- </map>
- </property>
在bean标签中设置lazy-init属性
- 不写此标签或者属性值为defult,为非懒加载
- 取值为false,为非懒加载
- 取值为true,则为懒加载
- 如果此bean不是单例模式,而且也不是懒加载,则是在使用时创建对象
autowire自动装配(自动注入)
- default是继承自beans标签中的defualt-autowire属性
- Byname是通过名字的进行自动注入,如果容器中有和属性名称一致的bean,就自动注入。如果没有,就不会注入,如果有同名但是不是同一类型的话,会报错
- ByType通过类型自动注入,如果容器中有同类型的对象而且只有一个,会进行自动注入,如果没有此类型的不注入。如果有多个同类型的bean,会报错
spring使用有参构造函数创建对象
- spring使用有参构造函数创建对象
- constructor-arg的index可以设置参数的位置,value或者ref可以设置参数的值
把方法的返回值加入到spring容器
- 使用bean标签factory-bean配置方法所在类的bean对象,factory-method配置方法的方法名
把静态方法的返回值加入到spring容器
- 使用bean标签class配置静态方法所在的类,factory-method配置静态方法的方法名
@autowire注解
- autowire默认是按照类型自动装配
- 如果上下文中不存在该类型,抛出异常
- 如果有多个根据属性名字自动注入,如果没有相同的也会把容器中的一个对象注入进来
- 如果有一个正常注入
- 如果容器中有多个同类型对象,而且想使用autowire可以与qualifier注解一起使用,也可以使用属性的名称指定bean的id
@resource注解
- resouce默认通过名字进行自动注入
- 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
- 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
- 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到抛出异常,如果找到多个,会通过属性名进行匹配
- 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,去根据类型去匹配想对应的bean,如果有,自动装配,如果类型也没有匹配的则抛出异常
resource和autowired的区别
resource | autowired |
---|---|
@resource是javaee的注解 | @autowired是spring的注解 |
@resource默认根据名字自动注入 | @autowired是根据类型自动注入 |
spring常用注解
- @controller 用来标注控制层的类,并且把此类交给spring进行管理
- @service 用来标注业务层的类,并且把此类交给spring进行管理
- @repository 用来标注dao层,并且把此类交给spring进行管理
- @component 用来标注MVC意外其他的层,并且把此类交给spring进行管理
Cglib动态代理模式
Cglib动态代理所需的包不是jdk自带的,需要引入外部包,引入之后创建代理对象生成工厂类,此类实现MethodInterceptor接口,重写intercept方法,此方法中定义生成的代理对象如何增强方法。
创建cglib动态代理对象:
1,创建enhancer对象
2,enhancer.setCallback(cglibScholProxy);调用此方法设置获取代理工厂类实体。
3,enhancer.setSuperclass(Schoo.class);调用此方法设置被代理对象类型,
4,enhancer.create();创建代理对象。
静态代理:需要手写代理类,复用性和扩展性比较差。
Jdk动态代理:是jdk提供的api,不需要手写代理类,生成代理对象速度块,被代理的对象必须实现一个接口。
Cglib动态代理:是cglib的外部包,不属于jdk,不需要手写代理类,扩展和复用性强,被代理对象不需要实现接口,但是使用cglib代理的对象不能被final修饰,创建对象速度不如jdk动态代理。
本文介绍了spring的底层实现和基本用法是
希望对你有帮助