Spring概念
Spring是轻量级的开源的JavaEE的框架,可以解决企业应用开发的复杂性(框架的特征)
Spring核心:
- IOC: 反向控制,把创建对象的过程交给spring(减低耦合度)
- AOP:面向切面,不修改源代码进行功能增强
(Aop将横向关注点从它们所影响的对象中分离出来,而IOC的依赖注入是将应用程序对象从彼此中分离出来)
下面来具体说一下IOC:
一.IOC底层原理
- xml解析、工厂模式(降低耦合度)、反射
二.IOC接口
Spring提供IOC容器实现的两个方式(两个接口)
- BeanFactory:IOC容器基本实现,是Spring内部的接口,不提供给开发人员使用
- ApplicationContext:BeanFactory接口的子接口,提供更多更强大的功能,一般有开发人员使用
不同之处:BeanFactory加载配置文件时不会创建对象,在获取对象使用时才会创建对象 。ApplicationContext加载配置文件时就会把在配置文件中的对象创建
ApplicationContext接口实现:
- FileSystemXmlApplicationContext:该容器从XML文件中加载已被定义的bean. 需要xml文件的完整路径(从磁盘开始的路径)
- ClassPathXmlApplicationContext:该容器从XML文件中加载已被定义的bean. 只需要正确配置ClassPath环境变量即可 ,只需要xml文件的包路径。
三.IOC操作Bean管理
bean管理指的时两个操作:Spring创建对象,Spring注入属性
基于xml创建对象:
- 在Spring配置文件中(.xml)通过bean标签,标签里面添加属性,实现对象创建
属性: id:唯一标识 class: 类全路径(包类路径) name:唯一标识,可以含有特殊字符 - 创建对象的时候,默认执行无参构造函数完成对象创建()
基于xml方式注入属性(依赖注入,就是注入属性):
-
第一种注入方式:使用set方法注入
1)创建类,定义属性和相对应的set方法
2)在Spring配置文件配置对象创建,配置属性注入 ,在<bean>标签中使用<property name="属性名" value="属性值"> </property>标签完成属性注入
-
第二种方式:使用有参构造输入
1)创建类,定义属性和相对应的有参数构造方法
2)在Spring配置文件进行配置,在<bean>标签中使用<constructor-arg name="属性名" value="属性值"></constructor-arg>标签来完成属性注入
-
第三种注入方式:p名称空间注入 1) 添加p名称空间在配置文件中
2) 进行属性注入,在bean标签里面进行操作 ,直接p:属性名= “属性值”
xml方式注入其他类型属性:
- 字面值
null
属性值包含特殊符号
1)使用转义字符:如<>为<>
2)将含有特殊字符的内容写到CDATA中 <![CDATA[含特殊符号的内容]]>
注入属性
- 外部bean
a.创建两个类service类和dao类
b.在service中调用dao里面的方法
c.在Spring配置文件中配置 value换为ref 外部再创建一个dao对象
- 内部bean
一对多关系:部门和员工
a.创建 Emp和Dept类
b.根据两者之间关系,在Emp类中使用对象形式表示部门
c.设置Spring配置文件 设置对象属性 注入内部bean(嵌套)
<property/>或<constructor-arg/>元素中的<bean/>元素被称为内部bean
- 级联
注入数据、集合
- 在集合里面设置对象的值
在<list>标签中,将<value>标签换成<ref>标签,该标签中设置bean的属性值就是,再另外创建集合中设置的对象的bean对象,设置对象的值,的id属性的值。
- 把集合注入部分提取出来
在Spring配置文件中引入名称空间util,把提取部分写在util标签中
Spring的两种bean
一种是普通bean,另一种是工厂bean(FactoryBean)内置的
-
普通bean:在配置文件中定义bean类型就是返回类型
-
工厂bean:在配置文件中定义bean类型可以和返回类型不一样
1)创建类,让这个类作为工厂bean,实现接口FactoryBean
2)实现接口里面的方法,在实现的方法中定义返回的bean类型
在第一个方法中定义返回的bean类型
四.Spring Bean的作用域
在Spring配置文件中定义一个bean,scope
属性确定bean的作用域:singleton(默认)、prototype、request、session
-
singleton,单实例对象,Ioc容器中只会存在一个共享的bean实例,在加载spring配置文件时就会创建单实例对象。
-
prototype,多实例对象,每次调用bean时,都返回一个新的实例,每次调用getBean()时,创建多实例对象。
xml自动装配
Spring自动装配:不使用<property> 和<constructor-arg>元素的情况下自动装配bean之间的关系。
- bean的auto-wire属性实现,
默认 no(不使用自动装配)
byname 由属性名自动装配
byType 有属性类型自动装配,但如果存在不止一个该类型的bean,则无法识别,就会报错
IOC操作Bean管理注解方式
1.什么是注解:
- 注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值…)
- 使用注解,注解作用在类上,方法上,属性上面
- 使用注解的目的:简化xml配置
2 . Spring针对Bean管理中创建对象提供注解
四个:(这四个注解功能是一样的,都可以用来创建bean实例)
- @Component
- @Service
- @Controller
- @Repository
3 .基于注解方式实现对象创建
- 引入依赖
- 开启组件扫描
使用context名称空间 ,base-package属性
如果扫描多个包,多个包可以用逗号隔开
还可以直接扫描包上层目录
<context:component-scan base-package="扫描的包"/>
-
创建类,在类上边添加创建对象注释
@Component(value="") (四个注释使用哪一个都可以)
注释 相当于使用bean标签
value的属性值相当于bean标签中的id值
在注解中value值可以省略不写,默认值是类名,首字母小写 -
开启扫描中的配置细节(组件扫描配置)
在<context:component-scan >标签中 use-default-filters属性值设置为false,不使用默认配置filter(扫描包中所有类),自己配置filter
context:include-filter type=“annotation”,设置扫描那些内容
expression=“org.springframework.stereotype.Component” ,扫描只含有注释类型为Component的类
若是context:exclude-filter,则是扫描不包括注释类型为Component的类的其他所有类
基于注释方式实现属性注入
- 1)Autowired:根据属性类型进行自动装配。可以应用到bean属性的setter方法,非setter方法,构造函数和属性
把service 和dao层对象创建:在service和dao类添加创建对象注释。
把service注入dao层:在service类中添加dao类型属性,在属性上面使用注释
- 2)@Qualifier:根据属性名称进行注入。该注释的使用需要和@autoWired一起使用。通过指定确切的将被连线的bean,可以用来删除混乱(当一个接口有多个实现类的话,此时如果只根据属性类型匹配,电脑不知道具体匹配哪一个属性注入,就会引起混乱,导致报错)。
- 3)@Resource:可以根据类型注入,可以根据属性名称注入 -->该注释不是Spring中的,一般不太建议使用
直接使用是根据属性类型注入,含有value属性的是根据属性名称注入
- 4)@Value:注入普通类型属性(上边三个都是对象类型注入)
- 5)完全注解开发 @Comfiguration @ComponentScan(basePackages = {“包名”})
删掉bean文件,创建配置类,替代xml文件
编写测试类,使用的Spring接口不同