Spring之IOC、DI、@注解

本文摘要:

 1.IOC:创建对象的三种方式

 2.DI :依赖注入的两种方式

 3. 注解代替配置文件

@Repository  :dao层
@Service :service层
@Controller :web层

@Component:Component层


@Resource

@Autowired

@qualifier("名称")

-------------------------Spring理论基础-----------------------------------

id,在整个ioc容器中bean的标识

class,具体要实例化的哪一个类
scope,范围,作用域
constructor argument,构造器参数
property,成员变量
Autowiring mode,自动装配模式
lazy-initialization mode,懒加载模式
initialization/destruction method,初始化/销毁方法


Bean生命周期:定义——初始化——使用——销毁

一、初始化:
方法1.实现org.springframework.beans.foctory.InitializingBean接口,覆盖afterPropertiesSet方法。系统会自动查找afterPropertiesSet方法,执行其中的初始化操作。
方法2.配置init-method
例如设置bean中init-method="init"那么在初始化过程中就会调用相应class指定类的init()方法进行初始化工作。

二、销毁(与初始化类似):
方法1.实现org.springframework.beans.foctory.DisposableBean接口,覆盖destory方法。
方法2.配置destory-method。

三、配置全局初始化、销毁方法(属于默认配置,参考截图)

注意:
1、当三种方式同时使用时,全局(默认的)初始化销毁方法会被覆盖。
2、另外实现接口的初始化/销毁方式会先于配置文件中的初始化/销毁方式执行,然后再执行配置的。//初始化(接口式)——初始化(<bean>标签配置)——销毁(接口式)——销毁(<bean>标签配置)
3、即使没有以上三种初始化方法也是可以编译执行。

4、如果配置全局初始化、销毁,但没有写对应方法,则可通过编译;如果在<bean>标签中配置初始化、销毁,但没有写对应方法,则报错。


当 bean 实现 Sping 中以 Aware 结尾的接口后,初始化可以获取相应资源

Bean 实现 ApplicationContextAware 接口
public void setApplicationContext(ApplicationContext applicationContext)
通过 applicationContext.getBean("xxx") 获取 bean

Bean 实现 BeanNameAware 接口 
public void setBeanName(String name) 

通过 this.beanName = name 获取 bean

---------------------------------------Spring操作之 IOC 控制反转--------------------------------------------------

Spring 容器创建对象的三种方式

前言:关于调用

         //1、启动 spring 容器
         ApplicationContext context =
                 new  ClassPathXmlApplicationContext( "applicationContext.xml" );
         //2、从 spring 容器中取出数据
         HelloIoc IOC = (HelloIoc) context.getBean( "helloIoc" );
         //3、通过对象调用方法
         IOC.sayHello();

1.利用默认的构造方法。

    

     <bean id= "唯一标识1"  class = "类全名"  ></bean>  
     <!-- 别名属性  name:和bean的 id 属性对应 -->
     <alias name= "唯一标识1"  alias= "别名" />


2.利用静态工厂方法。

  ①创建静态工厂类 HelloStaticFactory.java

1
2
3
4
5
6
7
8
9
10
11
12
package  com.ys.ioc;
 
public  class  HelloStaticFactory {
     public  HelloStaticFactory(){
     }
     //静态工厂方法
     public  static  HelloIoc getInstances(){
         return  new  HelloIoc();
     }
 
}

  ②applicationContext.xml 中进行如下配置:

1
2
<!--  factory-method:静态工厂类的获取对象的静态方法  class :静态工厂类的全类名  -->   
   
  <bean id= "helloStaticFactory"  factory-method= "getInstances"  class = "com.ys.ioc.HelloStaticFactory" ></bean>

3.利用实例工厂方法。

  ①创建实例工厂类 HelloInstanceFactory .java

1
2
3
4
5
6
7
8
9
10
11
12
13
package  com.ys.ioc;
 
public  class  HelloInstanceFactory {
     public  HelloInstanceFactory(){
     }
 
     //利用实例工厂方法创建对象
     public  HelloIoc getInstance(){
         HelloIoc instanceIoc =  new  HelloIoc();
         return  instanceIoc;
     }
}

  接着在 applicationContext.xml 中进行如下配置:

1
2
3
4
5
6
7
8
<!--
         factory-bean:指定当前Spring中包含工厂方法的beanID
         factory-method:工厂方法名称
       --> 
     <bean id= "instanceFactory"  class = "com.ys.ioc.HelloInstanceFactory" ></bean> 
     <bean id= "instance"  factory-bean= "instanceFactory"  factory-method= "getInstance" ></bean> 


---------------------------------------Spring操作之 DI 依赖注入--------------------------------------------------

Spring 依赖注入的两种方式

1.利用set方法给属性注值。

    ① 创建实体类 Person

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package  com.ys.di;
 
import  java.util.List;
import  java.util.Map;
import  java.util.Properties;
import  java.util.Set;
 
public  class  Person {
     private  Long pid;
     private  String pname;
     private  Student students;
     private  List lists;
     private  Set sets;
     private  Map maps;
     private  Properties properties;
     
   //此地是get、set方法
     
}

  //我们看到这个实体类包括引用类型 Student 类,基本数据类以及集合数据类型。

  ②在 applicationContext.xml 中进行赋值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<!--
     property是用来描述一个类的属性
     基本类型的封装类、String等需要值的类型用value赋值
     引用类型用ref赋值
-->
<bean id= "person"  class = "com.ys.di.Person" >
     <property name= "pid"  value= "1" ></property>
     <property name= "pname"  value= "vae" ></property>
     <property name= "students" >
         <ref bean= "student" />
     </property>
     
     <property name= "lists" >
         <list>
             <value> 1 </value>
             <ref bean= "student" />
             <value>vae</value>
         </list>
     </property>
     
     <property name= "sets" >
         <set>
             <value> 1 </value>
             <ref bean= "student" />
             <value>vae</value>
         </set>
     </property>
     
     <property name= "maps" >
         <map>
             <entry key= "m1"  value= "1" ></entry>
             <entry key= "m2"  >
                 <ref bean= "student" />
             </entry>
         </map>
     </property>   
     
     <property name= "properties" >
         <props>
             <prop key= "p1" >p1</prop>
             <prop key= "p2" >p2</prop>
         </props>
     </property>  
     
</bean>
 
 
<bean id= "student"  class = "com.ys.di.Student" ></bean> //注意看看代码24行


2.利用 构造函数 给属性注值。

 ①在实体类 Per'son.java 中添加两个构造方法:有参和无参

1
2
3
4
5
6
7
//默认构造函数
     public  Person(){}
     //带参构造函数
     public  Person(Long pid,Student students){
         this .pid = pid;
         this .students = students;
     }

  :在 applicationContext.xml 中进行赋值

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- 根据构造函数赋值 -->
     <!--
         index  代表参数的位置  从 0 开始计算
         type   指的是参数的类型,在有多个构造函数时,可以用type来区分,要是能确定是那个构造函数,可以不用写type
         value  给基本类型赋值
         ref    给引用类型赋值
       -->
     <bean id= "person_con"  class = "com.ys.di.Person" >
         <constructor-arg index= "0"  type= "java.lang.Long"  value= "1" >
         </constructor-arg>       
         <constructor-arg index= "1"  type= "com.ys.di.Student"  ref= "student_con" ></constructor-arg>
     </bean>
     <bean id= "student_con"  class = "com.ys.di.Student" ></bean>

---------------------------------------Spring操作之 注解:DI 、IOC--------------------------------------------------

@Repository  :dao层
@Service :service层
@Controller :web层
@Component:Component层
 

1.在 applicationContext.xml 中引入命名空间


    注意:第一个 xmlns:context ,这表示标签格式应该是 <context:标签名>

2.在 applicationContext.xml 文件中引入注解扫描器

1
2
<!-- 组件扫描,扫描含有注解的类 -->
     <context:component-scan base- package = "含有注解类的包名" ></context:component-scan>

   ****@Resource : 用来消除 set ,get方法。


   ****@Autowired :功能和注解 @Resource 一样,可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。只不过注解 @Resource 是按照名称来进行装配,而@Autowired 则是按照类型来进行装配。

     @Autowired
     private  PersonDao personDao; //PersonDao可以是接口

    那么问题来了,如果 PersonDao 的实现类有多个呢?

    解决:方案一

 解决:方案二


  在使用@Autowired时,首先在容器中查询对应类型的bean

    如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据

    如果查询的结果不止一个,那么@Autowired会根据名称来查找。

    如果查询的结果为空,那么会抛出异常。解决方法时,使用required=false


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值