1. 首先知道Spring是个什么.
Spring是分层的一个轻量级开源框架. 以反转控制IOC, 和面向切面变成AOP为内核. 提供了展现层spring MVC, 持久层Spring JDBC以及业务层事务管理等众多企业级应用技术.
Spring一直贯彻并遵守:好的设计优于具体实现, 代码应该易于测试. 所以Spring提供了IOC容器, 将对象之间的依赖关系交给spring来控制,避免硬编码造成了过度耦合. 通过Spring提供的AOP功能, 用户可以通过面向切面变成代替一些 使用面向对象编程比较困难的问题.
2. Spring体系结构(框架结构)
3. Spring中各个注解的作用 以及其使用方式.
@Component------------------------泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。(Component-------成分; 组分; 零件)
@Resource------------------------(资源)
@Autowired-----------------------(自动绑定)
@Repository-----------------------于标注数据访问组件,即DAO组件(repository-------仓库; 贮藏室,容器。)
@Service----------------------------用于标注业务层组件(我们通常定义的service层就用这个)
@Controller-------------------------用于标注控制层组件(如struts中的action)
在编写code的时候, 可以将上述注解放在对应的类, 方法, 构造函数, 实体变量之前, Spring机制会去扫描这些标记并且进行装配.
一般在resources文件夹内存放一个配置文件, 叫applicationContext.xml文件.
其中表示扫描类包, 将标注Spring的注解的类自动转化Bean, 同时完成Bean的注入.
注入方式一般是将DAO的实现类注入到service的实现类当中, 将service的接口(注意不是service的实现类)注入到action中.然后属性加上@Autowired后不需要getter()和setter()方法,Spring也会自动注入。
实体变量,方法, 构造函数的注入一般用 @Resource 或者 @Autowired , 这些变量在配置文件中会随着类一起注入并转化成bean, 这么做的方便之处在于可以省略setter方法.
4. Spring核心之IOC控制反转.
Spring通过一个配置文件描述了Bean和Bean之间的依赖关系, 利用Java语言的反射功能实例化Bean并建立Bean之间的依赖关系.
5. 下面来看看如何装配一个Bean.
在Spring容器的配置文件中, 定义一个简单的Bean的配置片段, 如下:
一般情况下, 一个Spring IOC的bean即对应文件中的一个bean,其中id为这个bean的名称, 通过容器的getBean("foo")即可获取对应的Bean, 在容器中起到一个定位和查找的作用, 是外部程序和Spring IOC得一个桥梁.Class属性指定了Bean对应的实现的类.
id在IOC容器中必须是唯一的,id必须符合xml的命名规范,即必须以字母为开始, 后面可以使字母数字连字符下划线句号冒号等完整结束符.
也可以使用name属性, 但是由于name属性的名字可以不遵守命名规范而且同一个IOC容器中可以有多个重复名字的bean, 那么只有最后的那个Bean会生效, 前面的Bean则会被覆盖. 所以尽量推荐用id命名bean.
6. 依赖注入.
6.1 属性注入
属性注入是一个非常常用的注入方式. 要求被注入的bean有一个默认的构造方法, 并且被注入的属性要有setter的方法. Spring会通过默认的构造方法实例化一个Bean, 并通过反射的方式注入属性值.
如果一个Bean已经有了一个带参数的构造方法 ,则必须同时提供一个不带参数的默认构造方法. 否则在属性注入时候会抛出异常.下图是一个属性注入的ioc片段:
6.2 构造方法注入.
首先看有两个构造函数:
IOC片段怎么写:
构造方法注入的时候一般要将参数指定出index, typoe以及value确定注入的是指定的构造方法.
6.3 循环依赖注入
指的是注入两个bean之间存在彼此依赖关系.这样就陷入了死循环
6.4 IOC容器中引用其他的bean.
照例,先看一个IOC段:
这里可以看到 boss bean中的属性 引用了car bean, 通过ref元素.
所以这里要说一下ref元素应用bean的方式:
1. 通过bean属性引用当前容器或者父容器的bean, 这个是最常见的方式.
2. 通过local属性引用同一个配置文件的bean, 他可以用xml解析器来检验引用的合法性, 以便开发者在编程阶段就可以检查出自己的错误.
3. parent属性,用于引用父容器的bean
举一个父子容器,子容器引用父容器的例子:
6.5 使用p命名空间简化属性注入的xml配置
首先看看未使用p命名空间的属性注入IOC片段:
使用p命名空间后, 属性注入会简化很多:
6.6 Spring中Bean的作用域
如图:
6.7 AnnotationConfigApplicationContext 用于启动Spring容器.
6.8 下面的表格表示了三种配置bean的区别
这些配置没有优劣,只有适合的使用场景