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,敬请关注!
版权声明:本文为博主原创文章,未经博主允许不得转载。