Spring框架概述
1. 轻量级框架
2. 降低开发复杂性
3. IOC和Aop
4. 优点多多
入门案例
1. 下载spring
2. 导入相关jar包
3. 创建普通类,编写该类方法
4. xml配置
5. 代码编写:加载配置文件,获取配置创建的对象
IOC容器:Inversion Of Control 控制反转
1. IOC底层原理
- IOC底层原理:xml解析 + 工厂模式 + 反射(单纯使用工厂模式耦合度不够低)
- IOC过程:
第一步:xml配置 第二步:创建工厂类:Class.forName(class属性值).newInstance()
2. IOC接口
- BeanFactory接口,一般是spring内部使用—>获取对象时才创建对象(懒汉式)
- ApplicationContext接口:BeanFactory的子接口,更强大—>加载配置文件时就创建对象(饿汉式)----更好,在启动服务器时就已经创建好对象
3. IOC操作Bean管理:即Spring创建对象、注入属性
基于xml方式管理bean
创建对象:
- xml配置文件中bean标签配置
- 中属性:id,class,name(用于struct)
- 默认使用无参构造
注入属性:DI(依赖注入)
(1)使用set方法注入:定义类属性及其set方法,配置xml文件<bean><property name="属性名" value="值"></property></bean> (2)使用有参构造器注入:定义类有参构造方法,配置xml文件<bean><constructor-arg name="方法参数名" value="值"></constructor-arg></bean> (3)特别地:p名称空间注入:添加p名称空间xmlns:p=".../chema/p" ,就可以直接在bean标签中添加p:属性="" (4)注入属性特殊值:
1.null值:不填value,标签中加<null/>
2.属性值含特殊值:<![CDATA[属性值]]>
3.注入外部bean:<property name="属性名" ref="外部bean的id">
4.注入内部bean:<property>中省略value,里面嵌套一个bean---->外部bean也可以实现
5.注入级联赋值:(1)类似注入外部bean的方式;(2)在1的基础上加<property name="级联的bean.属性" value="值">(需要内部bean的get方法)
6.注入数组:<property>中加入<array><value>值</value></array>
7.注入List:<property>中加入<list><value>值</value></list>
8.注入set:<property>中加入<set><value>值</value></set>
9.注入Map:<property>中加入<map><entry key="" value=""></map>
10.集合里的值为对象类型:<property>中加入<list><ref bean="另一个bean的id"></ref></list>
11.把集合注入提取为公共部分:添加util名称空间-xmlns:util="...",xsi:schemaLocation="...",<util:list id="公共标识"><value></value></util:list>
两种bean
- 普通bean:配置文件中class属性就决定了返回的类型
- FactoryBean:配置文件中class属性和返回的类型可以不一样,创建一个类实现FactoryBean接口,重写方法getObject()定义要返回的类型
bean的作用域:
bean标签中scope属性设置创建的bean实例是单例(默认)还是多例
值为singleton:创建单例对象,在加载配置文件时就创建
值为prototype:创建多例对象,在getBean()时才创建对象
值为request:会把创建的对象放到request域中(了解)
值为session:会把创建的对象放到session域中(了解)
bean的生命周期:
(1)通过无参构造器创建bean实例
(2)调用set方法为bean属性赋值或引用其他bean
(~)调用把bean实例传递给bean后置处理器(BeanPostProcessor)的方法--postProcessBeforeInitialization
(3)调用bean的初始化方法(需手动配置)---<bean init-method="bean类中的方法名">
(~)调用把bean实例传递给bean后置处理器(BeanPostProcessor)的方法--postProcessAfterInitialization
(4)使用bean
(5)调用bean的销毁方法(需手动配置)---<bean destroy-method="bean类中的方法名">,ClassPathXmlApplicationContext.close()
xml自动装配:
很少用到,一般用注解
<bean>标签属性autowire="byName"----->根据属性名称自动装配
<bean>标签属性autowire="byType"----->根据类型自动装配
引入外部属性文件(properties):
(1)引入context名称空间
(2)<context:property-placeholder location="classpath:properties路径" />
(3)<property>的value="${key}"
基于注解方式管理bean:
bean管理创建对象的注解:
功能都是创建对象
@Component
@Service-----service层
@Controller-----web层
@Repository------dao层
创建对象:
1. 引入aop依赖
2. 开启组件扫描:引入context名称空间,<context:component-scan base-package="扫描包路径">
3. 在类前加@注解(value="实例对象名")----括号内容不写默认实例对象名为小驼峰类名
组件扫描细节配置
<context:component-scan base-package="com.atguigu" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<context:component-scan base-package="com.atguigu">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
注入属性:
-
@Autowired:根据属性类型注入 -
@Qualifier:根据属性名称注入,配合@Autowired使用 第一步:创建service类和dao类并在类前添加创建对象注解
第二步:在service类中的dao属性前加@Autowired注解,若dao实现类有多个,可以加@Qualifier(value="dao实现类名")
-
@Resource:根据名称类型都可,不属于spring,来自java扩展包 @Resource:根据类型注入
@Resource(name="dao实现类名"):根据属性名称注入
-
@Value:普通类型注入 在属性前@Value(value="属性值")
纯注解开发:
(1)@Configuration+@ComponentScan(basePackages={"扫描包路径"}) 注解一个配置类,代替xml配置
(2)new AnnotationConfigApplicationContext(配置类)
|