Java spring框架(底层原理+入门)

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的区别:

IOCDI
控制反转是从容器的角度在描述,描述完整点就是:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源依赖注入是从应用程序的角度在描述,可以把依赖注入描述完整点:应用程序依赖容器创建并注入它所需要的外部资源
	使用配置文件方式给属性赋值时,调用的是属性的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自动装配(自动注入)

  1. default是继承自beans标签中的defualt-autowire属性
  2. Byname是通过名字的进行自动注入,如果容器中有和属性名称一致的bean,就自动注入。如果没有,就不会注入,如果有同名但是不是同一类型的话,会报错
  3. ByType通过类型自动注入,如果容器中有同类型的对象而且只有一个,会进行自动注入,如果没有此类型的不注入。如果有多个同类型的bean,会报错

spring使用有参构造函数创建对象

  1. spring使用有参构造函数创建对象
  2. 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的区别

resourceautowired
@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的底层实现和基本用法是
希望对你有帮助

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值