01-Spring_ioc

一.Spring的容器对象

1.BeanFactory是spring容器的定层接口
2.接口ApplicationContext是BeanFactory的子接口; 
  实现类有:
  ClassPathXmlApplicationContext-->从类路径下读取配置文件 
  FileSystemXmlApplicationContext-->从绝对路径指定配置文件读取 
  AnnotationConfigApplication-->纯注解配置实用的类     

代码示例:

    ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml"); 
    Object userDao = ac.getBean("userDao");
3.BeanFactory与ApplicationContext的区别:
  BeanFactory创建容器对象时,只是加载了配置文件,没有创建对象,获取对象时,才创建对象。  
  ApplicationContext:在创建容器对象时,只创建单例模式的对象,多例模式的对象在获取时才创建对象

二.ClassLoader的api加载配置文件为输入流

//从类路径下读取配置文件 
InputStream in= Class.forName("").getClassLoader().getResourceAsStream("");

//从绝对路径指定配置文件读取
InputStream in= Class.forName("").getClassLoader().getSystemResourceAsStream("");  

三.SpringIOC容器默认创建的bean对象是单例的

   singleton:单例 默认值  
   prototype:多例的   

   可以通过xml或者注解配置其scope属性指定  

四.实例化bean的三种方式

1.Spring 容器常用的创建对象
1.<bean id="userDao" class="com.itcast.UserDao">  

2.静态工厂创建对象(getUserDao 是BeanFactory的一个静态方法,直接调用,不用创建工厂实例)
<bean id="userDao" class="com.itcast.BeanFactory" factory-method="getUserDao">

3.实例工厂创建对象(getUserDao 是BeanFactory的成员方法,不能直接使用,需要先创建工厂实例)
<bean id="beanFactory" class="com.itcast.BeanFactory"> 
<bean id="userDao" factory-bean="beanFactory" factory-method="getUserDao">   

五.IOC (控制反转)

IOC:控制反转包含 依赖注入 和 依赖查找  

控制反转理解:
传统创建对象是用new关键字来创建,是需要调用者主动创建,
但是现在如果使用IOC框架的话,比如Spring,Spring框架会通过工厂方法帮你把对象好,  
创建对象的工作不再是调用者,反转过来了,即创建对象的控制行为反转了。  

依赖注入:Dependency Injection  
简单理解:就是把我所需要的依赖对象直接注入进来,不需要再手动创建对象 
业务层需要持久层,通过配置文件或者注解配置传入持久层对象,就是依赖注入。

六.Spring 常用注解

@Component:标记在类上,不能用在方法上

 作用:创建对象,只要标记了,扫描到该包,对象就会创建

 衍生的三个注解  
 @Controller    :一般用于web(控制层)层上
 @Service        :一般用于业务层
 @Repository      :一般用于持久层

如果没有指定value的值,默认约定为简单类名首字母小写  

例如:
UserDaoImpl----->userDaoImpl  

@Autowired  --自动注入

可以标记在属性和set方法上,如果标记在属性上,可以没有set方法  
特点:默认自动按照类型注入  
流程:当属性、set方法上标记了@Autowired,会自动在容器中查询该属性类型的对象,  
     如果有且只有一个,则注入。   

@Qualifier:必须与@Autowired结合使用  
    作用:如果自动注入按照类型注入失败,则按照指定的名称注入;   
    如果没有@Qualifier,类型注入失败,则按照属性名按照名称注入  

@Resource  --自动注入
 流程:当属性、set方法标记了@Resource,会自动按照名称注入,如果名称没有找到,   
       则根据类型注入,如果类型有多个,则抛出异常   

总结:@Autowired:默认按照类型注入,如果类型有多个,则按照名@Qualifier配置的名称注入,   
                如果没有@Qualifier注解,则按照属性名称注入,如果没有找到,则抛出异常。  
                如果没找到,则抛出异常    -- spring提供的  
     @Resource:默认按照名称注入,如果名称没有找到,按照类型注入,    
                   如果类型有多个(一般同类型有多个实现类)则抛出异常。 --jdk提供的  

@Configuration:比较该类为配置文件类  
                可以替换applicationContext.xml    

@ComponentScan("com.themelove")  
 相当于<context:component-scan base-package="com.themelove"/> 

@Import:引入其他配置文件类  
 相当于xml中<import resource="classpath:applicationContext.xml"/>

@Bean:通过方法创建对象,并放入到spring容器中
 相当于xml中的<bean>标签    

@Scope("singleton|prototype")  
 配置对象的范围:相当于bean标签中的属性 scope="singleton|prototype"  

生命周期 
@PostConstruct:相当于bean标签的属性 init-method,构造方法执行之后执行   
@PreDestroy:相当于bean标签的属性:destroy-method,对象销毁之前执行  

@Value 给属性赋值  只能赋值简单类型    
@PropertySource:引入外部属性文件 
 相当于xml中的<context:property-placeholder location="classpath:jdbc.properties"/>   
 之后再xml中直接用${jdbc.driver}进行引用    

七.Spring与junit的整合

引入依赖
1.引入依赖 
  <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <versioin>4.12</version>
  </dependency>  

<!--引入spring-5的测试包:必须引用相应的junit包,junit的版本必须是4.12以上-->  
<!--引入spring-4的测试包:必须引用相应的junit包,junit的版本必须是4.9以上-->    

  <dependency>
     <groupId>org.springframework</groupId> 
     <artifactId>spring-test</artifactId>  
     <version>5.0.2.RELEASE</version> 
  </dependency>    

2.配置测试环境  
  a.替换junit的运行器,为spring与junit整合后的运行器  
    @RunWith(SpringJunit4ClassRunner.class)    

  b.指定配置文件路径,会自动创建容器对象   
    xml方式
    @ContextConfiguration({"classpath:applicationContext.xml"})   
    @ContextConfiguration(classes={SpringConfiguration.class})  

  c.测试:
    直接用@Autowired从容器中直接获取某类型的对象   

八.Spring的核心包

org.springframeworkspring-context5.0.2.RELEASE

其中子依赖为  
spring-beans : javabean 工厂相关
spring-aop  : aop相关
spring-core :spring核心包
spring-expression  :表达式相关:比如aop定义切入点的表达式  
                    * com.themelove.service.impl.*.*(..) 

Last updated

Was this helpful?