Spring框架--IOC

Spring框架--IOC

    对于Spring框架,就像它的创始人 Rod Johnson说的一样“Spring存在的目的就是使得已经存在的技术用起来更加的简单”,例如它可以整合持久层框架Mybatis,Hinernate、也可以整合web框架SpringMVC和struts2等一样,它使得我们框架的整合变得更加的易于操作。
     Spring分层主要分为:
                                  M(Module)持久层如:JDBC、Mybatis,Hibernate,SpringData等;
                              V(View)视图层如:SpringMVC;
                              C(Service)服务层如:Spring,Struts2等;
    它的特点主要有六个:
                            1.解耦、简化开发、
                            2.大工厂。对所有对象的创建和依赖关系进行维护。
                            3.AOP编程。面向切面的思想相较于oop(面向对象的编程)来说,使得编程易于入手。
                            4.事务支持。也就是说不论是对象的创建,依赖关系的维护还是事务的管理都交由框架来管理。
                            5.易于集成各种优秀的框架。
                            6.降低了JAVAEE API的使用难度。

      Spring有两大核心分别是IOC以及AOP,接下来我们主要来说第一个IOC:

  一 IOC的本质就是将对象的创建权交给Spring,那么它到底反转的是什么呢?其实就像DI的提出这说的那样,控制反转实质上说的就是对象的注入从主动变成了主动,所以说IOC与DI实际上是从不同的角度描述的是一件事情。
一个Spring测试项目的创建主要分为以下几部(本文以idea为例):、
           1.pom引入包,相当与eclipse中的导包操作。
           2.编写接口及其实现类。、
           3.核心文件的配置,配置文件默认的名字是applicationContext.xml。
           4.编写测试类进行测试。
对于3.中的核心文件的配置来说:内部使用IOC的思想来创建对象如并且默认使用单例模式:
   <bean id="" class="" ></bean>(其实内部用的是反射的方法,根据类名来得到对象)
   id代表的是你所要创建这个对象的名字 此处以userDao为例。
   class代表的是你创建的这个对象的类的实现类的全路径 ,此处以com.qf.Dao.UserDaoImpl为例。
在这个bean里面还有其它的属性例如:
               init-Method:可以通过这个属性来定以初始化方法;
               destory-Method:可以通过这个属性来定以销毁方法;

               scope:可以用来声明是单例还是多例子,如果是但例那么每次得到的对像是同一个对象(他们hashcode是一样的),如果是多例每次的到的都是不同的对象。

其实bean的管理就是对象的管理。
对于4.的测试来说,可以通过classPathXmlApplicationContext这个类来加载核心配置文件
加载之后得到一个对象context(对象的名字可以自己命名),利用这个对象的getBean("id")方法来的到具体的对象;
其中的id指的就是之前配置文件中提到的<bean>里面的id名称,spring会根据这这个id拿到对应的class在利用反射的方法返回对象。
二 DI 依赖注入(Dependency Injection)

       依赖注入有两种方式setter注入和构造方法注入。
        1.setter注入

对于这种注入方法来说:首先你需要在你用到对象的类中做对象的声明,作为这个类的一个属性,然后为其提供Setter方法。
然后在配置文件中:在这个属性所在类对应的<bean></bean>标签内部加入<property></property>标签;
 
  
对于property这个标签格式如下(这个标签完成的基于是对象的注入):
<property id="" ref=""></property>
id指的是这个对象作为属性存在于类中的属性名
ref指的是在配置文件中另一个<bean>的id,你创建的是哪个类的对象,就写对应哪个<bean>的id;
这个属性的注入默认用的就是自己外部所对应<bean>提供的setter方法,也就是之前创建的setter方法。
此处做一个扩展,配置文件是怎么反射的,其实在框架里面有一个对象工厂类的名字是BeanFactory它里面提供了很多的方法来得到对象以及类型等。
 如getBean(String name)根据名字来获取对象

    class<?> getType(String name)根据名字来获取类型;
    <T> T getBean(String name,class<T> requiredType)根据name+class来获取对象;

     <T> T getBean(class<T> requiredType)根据class来获取对象;

    Ojbect  getBean(String name,Obiect...args)根据name+参数来获取对象;
   <T> getBean(class <T> requiredType,Object...args)根据class+参数来获取;

  还有一些判断的方法如:
  containBean(String name) 判断是否有这个类;

  isPrototype(String name) 判断产生对象是否是多例;
  isSingleton(String name)判断产生对象是否是单例;

   2.构造方法注入
  
   首先把对应的对象那属性写在对应类的构造方法之中。相当于有参构造。

    主要有两种注入的方式分别是名称赋值索引赋值
    若是变量属性则名称赋值的格式为:在某个<bean>内部用<constructor-arg name="" value=""></constructor-arg>标签
    同样name指的是属性的名称,value指的是这个属性的值。

    若是对象作为属性则这个里面不能再用value则应该用ref它的值就是其它bean的id值;
    同样对于索引赋值来说:标签内部是index 和 value index的值是更具它在对应类中的顺序来决定的,索引从0开始;
3.集合数组注入
  对于数组来说:在其所属的类对应的<bean>中
        <property name="数组名">

               <array>

               <value>具体的值</value>......可以有多个
                </array>
          </prperty>

对于集合来说:
       集合主要有list,set,map,propertise(属性文件)
    list:
<property name="数组名">
         <list>

           <value>具体的值</value>......可以有多个

           </list>
  </prperty>
set:
<property name="数组名">
         <set>

           <value>具体的值</value>......可以有多个

           </set>
  </prperty>
map:
<property name="数组名">
         <map>

           <entry key="" value="具体的值"></value>......可以有多个

           </map>
  </prperty>
propertise:
<property name="数组名">
         <props>

             <prop> 具体的值
            </prop>.....
           </props>
  </prperty>
3.注解开发
注解的特点:减少了配置,注解直接写在类中;
注解并不能解决所有的问题,如每次修改后需要重新编译。
注解测试主要分为五步:
       在核心配置文件中引入约束;
       添加注解:最主要的一个注解是@Component(此处的内容相当于bean中的id的内容)相当于配置文件中的<bean>
                         在它之下有衍生了具体的注解如服务层用的就是@Service,持久层用的是@Repository等
                        对于一般的类型的变量用@Value(变量的值)
                       对于对像两个@Autowire自动类型注入、@Qualifire("")按名称创建对象。
       在核心配置文件中开启注解扫描:
<context:component-scan base-package="含有注解类的包名称"></ context:component-scan>
       最后编写测试类进行测试。
注意:但凡在某个包的某个类中加了注解,就瑶将这个包开启注解扫描,否则会发生错误。




下篇文章将为大家说明另一个核心AOP,敬请关注!
版权声明:本文为博主原创文章,未经博主允许不得转载。

猜你喜欢

转载自blog.csdn.net/qq_42112846/article/details/80819673