简单来说,spring像是一个粘合剂,可以实现动态代理为基础的面向切面编程(AOP),以及控制反转(IOC)。
所谓的面向切面编程,就像它的名字一样,在不破坏耦合性的情况,实现了往代码里面插代码。
作为overview,同样来一个例子展示spring IOC的使用:
先导入jar包,利用maven可以导入jar包的依赖,以及依赖的依赖…
第一步,写出一个实体类:
1 2 3 4 5 6 7 8 9 10 11 12 public class Hello { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public void show(){ System.out.println("Hello,"+ name ); } }
第二步,配置spring的配置文件
1 2 3 4 5 6 7 8 9 10 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--bean就是java对象 , 由Spring创建和管理--> <bean id="hello" class="com.wang.pojo.Hello"> <property name="name" value="Spring"/> </bean> </beans>
第三步,也是最后一步—测试
1 2 3 4 5 6 7 8 9 @Test public void test(){ //解析beans.xml文件 , 生成管理相应的Bean对象 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); //getBean : 参数即为spring配置文件中bean的id . Hello hello = (Hello) context.getBean("hello"); hello.show(); }
简单三步,却道出了spring的核心api—-ApplicationContext
对象的创建由之前的new,变成了被动的接收对象,这个过程就是控制反转。
也就是IOC思想:从主动的编程转变为被动的接收。这就是spring框架的灵魂,之后我们就可以把mybatis的东西全交给spring托管,需要用的时候直接接收对象即可!
以下一一来介绍各个步骤: 第三步,测试 我们从后往前介绍,先来看spring的核心api,ApplicationContext,它有两个实现类
这里主要介绍其中一个不基于web的,ClassPathXmlApplicationContext,先读取spring的配置文件,就可以得到context对象,此时context对象就可以把他看作一个中介,只需要调用它的方法就可以得到我们想要的对象。
第二步,spring的配置文件 这里是spring的大头
可以把这个xml文件看作是中介登记手册,想要进行代理的类都要在这里注册,并设置对应的属性值,下面简单描绘一下它的结构。
-—sping xml的头标签(一堆url)
context标签,用于读取配置文件
一堆bean标签,代表每个来登记的类
import标签,用于引入其他spring xml,常用于团队协作
-—-sping结束标签
下面一一介绍:
头文件常常长成这样,可以理解为,xml的依赖,一般都是复制粘贴所得。
1 2 3 4 5 6 7 8 9 10 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> </beans>
context标签用于导入配置文件,如:
1 <context:property-placeholder location="classpath:db.properties"/>
值得介绍的就是这个bean标签,是spring的核心,它就是用于控制注入的核心标签。
值得注意的是,bean标签注入的类一定是要有set get方法以及空参构造器。
不同类型的属性,注入的标签有些许的不同。
具体可以参考这个文章
Damon:Spring常用的注入方式
值得注意的是,c命名空间注入,c就是构造器的意思,适用于一些本身没有空参构造器的情况。
1 2 3 导入约束 : xmlns:c="http://www.springframework.org/schema/c" <!--C(构造: Constructor)命名空间 , 属性依然要设置set方法--> <bean id="user" class="com.wang.pojo.User" c:name="wang" c:age="18"/>
然后是import标签
1 <import resource="{1 path}/beans.xml"/>
然后是第一步,就是实体类 这一步本身没什么可说的,但是,我们可以在这一步中使用注解来提高开发效率。
准备工作: 1、spring配置文件引入头
1 2 3 4 5 6 7 8 9 10 11 12 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> </beans>
2、在context标签中开启注解支持
1 <context:1 annotation-config/>
在引用的属性上面直接加@Autowired 注解即可
@Autowired是根据类型自动装配的,加上@Qualifier则可以根据byName的方式自动装配·
还有一个更加智能的标签
@Resource如有指定的name属性,先按该属性进行byName方式查找装配;
其次再进行默认的byName方式进行装配;
既然属性可以自动装配,类本身为什么不行呢? 先要context标签设置要扫描的包
1 2 <!--指定注解扫描包--> <context:component-scan base-package="com.wang.pojo"/>
在指定包下编写类,就可以添加注解了
1 2 3 4 5 @Component("user") // 相当于配置文件中 <bean id="user" class="当前注解的类"/> public class User { public String name = "wang"; }
同样的,在注入属性为常量时,也可以使用注解
1 2 3 4 5 6 7 @Component("user") // 相当于配置文件中 <bean id="user·" class="当前注解的类"/> public class User { @Value("wang") // 相当于配置文件中 <property name="name" value="wang"/> public String name; }