参考慕课网视屏和慕课网上笔记
专题一:IOC ---- Spring入门
spring学习手册记录本
参考spring面试题及答案解析(7)
在Spring中,它把所有的对象都称作为Bean
Spring的配置:1.基于XML的配置;2.注解方式@Autowired ;3.java类@configuration
基于.xml的文件配置(如spring-ioc.xml)
注解(如 Component通用注解、Respority持久层、Service服务层、Controller控制层等)
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd" >
<bean id="oneInterface" class="com.imooc.ioc.interfaces.OneInterfaceImpl">bean>
<--id="oneInterface(自定义)" class="配置的实现类"-->
beans>
使用示例:
//部分测试方法
public void test(){
OneInterface interface=super.getBean("oneInterface");//根据id获取bean,不需要new对象
interface.hello();//调用函数
}
基础:两个包
org.springframework.beans
org.springframework.context
BeanFactory 提供配置结构和基本功能,加载并初始化 Bean
ApplicationContext 保存了 Bean 对象并在 Spring 中广泛使用
本地文件
FileSystemXmlApplicationContext context = new
FileSystemXmlApplicationContext("F:/workspace/appcontext.xml");
Classpath
ClassPathXmlApplicationContext context = new
ClassPathXmlApplicationContext("classpath:spring-context.xml");
Web 应用中依赖 servlet 或 Listener
Spring系列之beanFactory与ApplicationContext -内容介绍的详细
BeanFactory和ApplicationContext都是接口,并且ApplicationContext是BeanFactory的子接口。
BeanFactory是Spring中最底层的接口,提供了最简单的容器的功能,只提供了实例化对象和拿对象的功能。而ApplicationContext是Spring的一个更高级的容器,提供了更多的有用的功能。
ApplicationContext提供的额外的功能:国际化的功能、消息发送、响应机制、统一加载资源的功能、强大的事件机制、对Web应用的支持等等。
加载方式的区别:BeanFactory采用的是延迟加载的形式来注入Bean;ApplicationContext则相反的,它是在IOC启动时就一次性创建所有的Bean,好处是可以马上发现Spring配置文件中的错误,坏处是造成浪费。
Spring 注入指在启动Spring容器加载bean配置的时候,完成对变量的赋值行为
常用的两种注入方式
设值注入
IOC容器在实例化bean的时候,会根据ref属性,把另一个bean的实例对象通过set()方法赋值给该name属性指定的成员变量.
InjectionServiceImpl.java
注意:需要在 Service 文件中添加 setInjectionDAO 方法。property 中 name 对应当前成员变量的名称
构造注入constructor-arg
<bean id="injectionService" class="com.zjx.service.impl.InjectionServiceImpl">
<constructor-arg name="injectionDao" ref="injectionDao">constructor-arg>
bean>
<bean id="injectionDao" class="com.zjx.dao.impl.InjectionDaoImpl">bean>
IOC容器在实例化bean的时候会根据ref属性把另一个bean的实例对象通过构造方法赋值给name属性指定的成员变量.
配置文件中 property改为 constructor-arg
使用构造注入前提必须在此bean对应的类中存在构造方法.且构造方法的参数必须与类中成员变量一致
.
注意:需要在 Service 文件中添加构造方法。name 对应 service 中 构造器参数名
public class InjectionServiceImpl implements InjectionService {
private InjectionDao injectionDao;
/**
* @param injectionDao 持久化接口
* 构造器注入
*/
public InjectionServiceImpl(InjectionDao injectionDao) {
this.injectionDao = injectionDao;
}
顺序
,优先依赖的优先注入。注解注入其实是使用注解的方式进行构造器注入或者set注入。
spring2.5开始提供了基于注解(Annotation-based)的配置,我们可以通过注解的方式来完成注入依赖。在Java代码中可以使用 @Resource或者@Autowired注解方式来经行注入。
@Resource和@Autowired的区别:
default-autowire="no/byName/byType/constructor "
作用:省去了在Spring的xml中配置property标签和constructor-arg标签,只需要配置bean标签即可.
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"
default-autowire="constructor">
<bean id="autoWiringService" class="com.imooc.autowiring.AutoWiringService">
<--以前的property、constructor-arg 标签name="" ref="" 都可以省略了-->
bean>
<--byName是通过id-->
<bean id="AutoWiringDAO" class="com.imooc.autowiring.AutoWiringDAO" >bean>
<--byType和constructor是通过class,可以不用配置id-->
<bean class="com.imooc.autowiring.AutoWiringDAO" >bean>
beans>
(1. No:不做任何操作
(2. byname:【检查ID】根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean ,并将其与属性自动装配【设值注入省去编写property 】
(3. byType:【检查Class】如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配; 如果存在多个该类型bean,那么抛出异常,并指出不能使用不byType方式进行自动装配;如果没有找到相匹配的bean,则什么事都不发生【设值注入省去编写property 】
(4. Constructor:【检查Class】与byType方式类似,不同之处在于它应用于构造器参数。如果容器中没 有找到与构造器一致的bean,那么抛出异常【构造注入省去constructor-arg】
byName和byType设置注入方式,Constructor构造器方式
byName要求bean标签的id属性需要和成员变量的名称一致【如果没找到对应的id 也不会报错 】(如果有2个相同的id,ioc容器会启动失败)
byType和constructor则跟id无关,跟class类型相关