概述
Spring框架核心功能:
管理程序的代码(代码的切入):AOP(面向切面的编程)
内存空间的创建(控制对象的作用域):IoC(依赖注入,控制反转)
笔记
Spring框架的IoC(Inversion of Control):控制反转IoC是Inversion of Control的缩写,是说对象的控制权进行转移,转移到第三方,比如转移交给了IoC容器,它就是一个创建工厂,你要什么对象,它就给你什么对象,有了IoC容器,依赖关系就变了,原先的依赖关系就没了,它们都依赖IoC容器了,通过IoC容器来建立它们之间的关系。
内存空间的创建:反射机制创建对象。
内存空间的赋值
- get/set方法注入:默认的赋值方式。
- id名称
- class类型
- 构造方法注入:对注入的bean需要创建相应的构造方法,基本数据类型采用的还是get/set方法。
- class类型
- 接口注入:接口引入进来。这种注入方式,还是以上两种方式,只不过是在实现数据注入的基础之上加入接口。
- get/set方法注入:默认的赋值方式。
Spring框架对象的匹配方式
- id名称(get/set方法注入)
- 类中的属性名和Bean中id值相匹配,
<property name="类的属性" ref="关联的Bean的id值" />
。 - 自动匹配。
- 类中的属性名和Bean中id值相匹配,
- class类型(get/set方法注入)
- 构造函数
- 接口注入
- id名称(get/set方法注入)
Spring框架对象的生命周期(在同一个ApplicationContext范围内的生命周期)
- 所有项目都可以设置生命周期
- 单例模式:
scope="sington"
,Spring只创建一个实例,一般逻辑业务都是使用单例模式 - 原型模式:
scope="protype"
,Spring每一次获取就会创建一个新的实例,一般action都使用原型模式
- 单例模式:
- Web项目的生命周期,session,request等
- 所有项目都可以设置生命周期
Spring可以将内存空间的创建和内存空间的赋值分离开来。
Spring加载配置文件的方式
Java项目
- FileSystemXmlApplicationContext()
ClassPathXmlApplicationContext() (推荐)
1234// 加载配置文件ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");LoginBL p = (LoginBL)ac.getBean("loginBL");
Web项目
实际工作中的Spring-IoC的实现方式
接口注入 + get/set方法的注入 + 手工匹配
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970// DAO接口public interface LoginDAO {public int login(String uname, String uwrod) throws Exception;}// DAO接口的实现类public class LoginDAOImpl implements LoginDAO {@overridepublic int login(String uname, String uwrod) {....}}// Service接口public interface LoginBL {public int login(String uname, String uword) throws Exception;}// Service接口的实现类public class LoginBLImpl implements LoginBL {// 接口注入private LoginDAO loginDao;@overridepublic int login(String uname, String uword) throws Exception {return this.loginDao.login(uname,uword);}public LoginDAO getLoginDao() {return loginDao;}public void setLoginDao(LoginDAO loginDao) {this.loginDao = loginDao;}}// Test测试类public class test {private LoginBL loginBl;private String uname;private String uword;public static void main(Stirng[] args) {loginBl.login(uname,uword);ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");LoginBL p = (LoginBL)ac.getBean("loginBL");System.out.println(p);}}Spring配置文件
123456789101112...<bean id="loginDAO" class="com.dao.impl.LoginDAOImpl" /><bean id="loginBL" class="com.service.impl.LoginBLImpl"><property name="loginDao" ref="loginDAO" /></bean>...
bean标签
- bean标签开辟空间,创建对象
应该采用id或者name属性标识一个bean。
Person类
1234567891011121314151617181920212223242526package com.bean.Personpublic class Person {private String name;private int age;public String getName() {...}public void setName() {...}public String getAge() {...}public void setAge() {...}}
Demo类
12345678910111213141516171819202122232425package com.bean.Demopublic class Demo {private String title;private Demo demo;public Demo() {}public Demo(Demo demo) {this.demo = demo;}public String getTitle() {...}public void setTitle() {...}}Spring配置文件之get/set注入、构造函数注入
1234567891011121314151617181920212223242526272829<!-- set/get方式 id与属性的手工匹配, 常用 --><bean id="xxx" class="com.bean.Demo"><property name="title" value="hello" /></bean><bean id="person" class="com.bean.Person" scope=""><property name="name" value="King" /><property name="age" value="18" /><property name="title" ref="xxx" /></bean><!-- 构造函数方式,bean的class属性和成员变量的自动匹配 不常用 --><bean id="xxx" class="com.bean.Demo"><property name="title" value="hello" /></bean><bean id="person" class="com.bean.Person" autowire="constructor"><property name="name" value="King" /><property name="age" value="18" /></bean>