spring简介
Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。
组成
IOC(Inversion of Control)
控制反转
通常写代码的思路:
这样做是传统的做法,程序员需要去创建对象,来作为业务的实现类,但是也会出现一个问题:如果用户的需求改变,那么就需要程序员去修改业务的实现代码(主体控制还是程序猿)
现在的改变
通过一个set方法来动态的创建对象实例,创建对象的主动权不在于程序员,而在于用户传入的是什么对象 (主体控制权就转到了用户和手中),那么这就是控制反转的原型。
通过这种做法,降低了耦合性,可专注于业务的实现上
IOC容器
- 该接口org.springframework.context.ApplicationContext代表SpringIoC容器,并负责实例化,配置和组装上述bean。
- 容器通过读取配置元数据来获取有关要实例化,配置和组装哪些对象的指令。
- 配置元数据以XML,Java批注或Java代码表示。它允许您表达组成应用程序的对象以及这些对象之间的丰富相互依赖关系。
采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,
Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection,DI)。
HelloSpring
1.编写JavaBean
2.编写配置文件
3.实例化对象
总结
hello对象是由Spring创建的
hello对象的属性是由Spring容器设置的,
这个过程就叫控制反转:
控制:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring来创建的.
反转:程序本身不创建对象,而变成被动的接收对象.
依赖注入:就是利用set方法来进行注入的.
IOC是一种编程思想,由主动的编程变成被动的接收.
可以通过newClassPathXmlApplicationContext去浏览一下底层源码 。
现在,我们彻底不用再程序中去改动了,要实现不同的操作,只需要在xml配置文件中进行修改,所谓的IoC,-句话搞定:对象由Spring来创建,管理,装配!
IOC构建的方式
总结
在配置文件加载的时候,容器中管理的对像就已经初始化了
spring 配置
1.别名
也可以使用name作为别名,而且name可以创建多个
2.import
用于多个人开发,可以将多个配置文件合并成一个
Dependency Injection(DI)依赖注入
依赖注入(DI)是一个过程,通过该过程,对象仅通过构造函数参数,工厂方法的参数或在构造或创建对象实例后在对象实例上设置的属性来定义其依赖关系(即,与它们一起工作的其他对象)。从工厂方法返回。然后,容器在创建bean时注入那些依赖项。从根本上讲,此过程是通过使用类的直接构造或服务定位器模式来控制bean自身依赖关系的实例化或位置的bean本身的逆过程(因此称为Control Inversion)。
使用DI原理,代码更加简洁,当为对象提供依赖项时,去耦会更有效。该对象不查找其依赖项,也不知道依赖项的位置或类。结果,您的类变得更易于测试,尤其是当依赖项依赖于接口或抽象基类时,它们允许在单元测试中使用存根或模拟实现。
1.构造器注入
2.Set方式注入
依赖注入:set注入
- 依赖:JavaBean对象创建依赖于容器
- 注入:JavaBean对象中的属性,由容器来注入
<bean class="com.ycm.pojo.Address" id="address">
<property name="address" value="福建省漳州市"/>
</bean>
<bean class="com.ycm.pojo.Student" id="student">
<!--第一种,普通注入-->
<property name="name" value="张三"/>
<!--第二种 Bean注入 使用ref-->
<property name="address" ref="address"/>
<!--数组注入-->
<property name="books" >
<array >
<value>三国演义</value>
<value>红楼梦</value>
<value>水浒传</value>
<value>西游记</value>
</array>
</property>
<!--list注入-->
<property name="hobbys">
<list>
<value>打球</value>
<value>听歌</value>
<value>写代码</value>
</list>
</property>
<!--set注入-->
<property name="games">
<set>
<value>王者荣耀</value>
<value>cf</value>
</set>
</property>
<!--map注入-->
<property name="card">
<map>
<entry key="1" value="游戏王"/>
</map>
</property>
<!--null注入-->
<property name="wife">
<null/>
</property>
<!--properties注入-->
<property name="info">
<props>
<prop key="学号">123456789</prop>
</props>
</property>
</bean>
3.其他方式注入
使用p命名空间方式注入(property namespace),通过属性注入
使用c命名空间方式注入(constructor namespace),通过有参构造的方式注入
bean的作用域
1.singleton(默认)
当作用域为单例时,ioc容器会创建一个共享实例,并存储在缓存中,下次对该实例的请求都将返回这个共享实例
2.prototype
每次通过getBean去获取一个实例对象的时候都会重新创建一个新的实例
3.其余的request,session,application只有在web中才会用到
Bean的自动装配
自动装配是Spring满足bean依赖一种方式!
Spring会在上下文中自动寻找,并自动给bean装配属性!
在Spring中有三种装配的方式
- 在xmI中显示的配置
- 在java中显示配置
- 隐式的自动装配bean [ 重要]
正常情况:
1.byName
byName会在容器中去自动查找,和自己对象set方法后面的值对应的beanId,自动设置,假设将cat改为cat1,那就会报错,因为找不到相匹配名字的set方法
2.byType
byType会在容器中去自动查找,和自己对象属性类型相匹配的类型,但是这个对象只能是一个,否则报错,这个对象甚至可以不要写id属性,因为就只有一个对象
3.使用注解实现自动装配
jdk1.5以后支持注解,spring2.5支持注解
使用注解开发会比使用xml文件开发要方便许多
配置注解的支持
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
</beans>
@Autowired
实现自动装配
直接在属性上使用即可!也可以在set方式上使用,还可以应用于构造函数
使用Autowired我们可以不用编写Set方法了,前提是你这个自动装配的属性在I0C (Spring) 容器中存在,且符合名字byname! .
如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注解[@Autowired] 完成的时候、我们可以
使用**@Qualifier(value=“xx” )**去配置@Autowired的使用,指定一个唯一的bean对象注入! .
@Resource
也可以像@Autowried那样去做自动装配,但是它和@Auutowried的区别:
都是用来自动装配的,都可以放在属性字段上
@ Autowired先通过byType的方式实现,再通过byName查找,而且必须要求这个对象存在! I
@Resource 默认通过byname的方式实现,如果找不到名字,则通过byType实现!如果两个都找不到的情况下,就报错!
@Component
组件的意思,放在类上,说明这个类被spring管理了,默认id为类名小写
@Value
@Component的衍生注解,其本质作用是一样的
在web开发中,按照mvc架构分层:
- dao 【@Respository】
- servicee 【@Service】
- controller【@Controller】
上面注解的本质是一样的,只是作用标记在不同的层面而已,都是代表将某个类注册到Spring容器中
@Scrope
用来标记作用域
小结
xml与注解:
- xml更加万能,适用于任何场合!维护简单方便
- 注解不是自己类使用不了,维护相对复杂!
xml与注解最佳实践:
- xml用来管理bean;
- 注解只负责完成属性的注入;
我们在使用的过程中,只需要注意-一个问题:必须让注解生效,就需要开启注解的支持
使用Java的方式来配置spring,可以不需要写配置文件
1.需要写一个配置类
实现类,不同于配置文件的