SSM进阶(一)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,敬请关注!

版权声明:本文为博主原创文章,未经博主允许不得转载。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值