1.什么是Spring?
Spring是一个分层的一站式轻量级开源框架,它的作用就是简化项目的开发,提高项目开发效率。
我们先来说一下Spring中的两大核心技术。IOC和AOP
AOP(Aspect Oriented Programming 面向切面编程),基于动态代理功能增强。
2.IOC
IoC(Inverse of Control 反转控制): 将对象创建权利交给Spring工厂进行管理。
它解决的问题:使用IOC可以解决程序耦合性高的问题
那么它又是如何创建对象的呢?我们来看一下Spring是如何创建对象的。
xml配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<bean id="userDao" class="cn.java.dao.impl.UserDaoImpl"></bean>
专门用来生产bean的工厂类如下:
public class BeanFactory {
// 从xml文件中解析bean,通过反射得到的对象存放到map中
private static Map<String, Object> map = new HashMap<String, Object>();
/**
* 解析xml文件
*/
static {
SAXReader saxReader = new SAXReader();
try {
Document document = saxReader.read(BeanFactory.class.getClassLoader().getResourceAsStream("beans.xml"));
Element root = document.getRootElement();
String id = root.attributeValue("id");
// 类的全路径名
String clazz = root.attributeValue("class");
// 通过反射生成对象
Object obj = Class.forName(clazz).newInstance();
map.put(id, obj);
} catch (Exception e) {
e.printStackTrace();
}
}
/**获取bean对象的工厂方法 */
public static Object getBean(String id) {
return map.get(id);
}
}
这样,我们在需要bean的时候只需要通过BeanFactory.getBean(“bean的id”)来获取对象。
Spring中的工厂
1.Applicationcontext
2.BeanFactory
使用上面两个工厂都可以获得对象
1.Applicationcontext
使用该接口可以获取到具体的Bean对象;
该接口下有两个具体的实现类
ClassPathXmlApplicationContext -- 加载类路径下的Spring配置文件
FileSystemXmlApplicationContext -- 加载本地磁盘下的Spring配置文件
下面演示这两种获取bean的用法:
public class TestIOC {
@Test
public void test1(){
//创建Spring工厂(创建IOC容器)
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) ac.getBean("userDao");
userDao.save();
}
@Test
public void test2(){
//创建Spring工厂(创建IOC容器)
ApplicationContext ac = new FileSystemXmlApplicationContext("C:/spring/applicationContext.xml");
UserDao userDao = (UserDao) ac.getBean("userDao");
userDao.save();
}
}
2.BeanFactory
@Test
public void test3(){
BeanFactory factory = new (new ClassPathResource("applicationContext.xml"));XmlBeanFactory
UserDao userDao = (UserDao) factory.getBean("userDao");
userDao.save();
}
那么BeanFactory和ApplicationContext又有哪些区别呢?
* BeanFactory -- BeanFactory采取延迟加载,第一次getBean时才会初始化Bean
* ApplicationContext -- 在加载applicationContext.xml时候就会创建具体的Bean对象的实例
Spring生成Bean的三种方式
之前使用的都是无参构造方法生成的。
1.无参构造方法
2.静态工厂实例化方式
3.实例工厂实例化方式
依赖注入
Dependency Injection,依赖注入,在Spring框架负责创建Bean对象时,动态的将依赖对象注入到Bean组件中!!
两种方式:构造方法注入和set方法注入
1.构造方法注入,你需要在实体类中提供有参构造方法
applicationcontext.xml文件配置bean如下:
<!-- 构造方法注入 -->
<bean id="car" class="cn.itcast.domain.Car">
<constructor-arg name="name" value="奥迪A6"></constructor-arg>
<constructor-arg name="price" value="57.3"></constructor-arg>
</bean>
2.set方法注入
创建People实体类,提供属性的set方法,不需要提供有参构造方法
<!-- 第二种注入形式:set方法注入 -->
<bean id="people" class="cn.itcast.domain.People">
<property name="name" value="小明"></property>
<property name="address" value="上海"></property>
<property name="car" ref="car"></property>
</bean>
注意:采用set方法注入时,类中一定要有无参构造方法,因为spring会先调用无参构造方法实例化对象。
Set方法其他注入写法
1.p命名空间写法
语法:
p:简单属性名=”值”
p:对象属性名-ref=”bean的id”
如:<bean id="people" class="cn.itcast.domain.People" p:name="小刚" p:address="北京" p:car-ref="car"></bean>
2.SpEL的写法(Spring3.0提供)
语法:
注入字符串:#{‘字符串’}
注入数字:#{数字}
注入其它对象:#{对象id}
如:
<bean id="people" class="cn.itcast.domain.People">
<property name="name" value="#{'小明'}"></property>
<property name="address" value="#{'上海'}"></property>
<property name="car" value="#{car}"></property>
</bean>
以上就是本人对IOC的一些总结,写的不好,还请大家多多原谅,欢迎大家一起讨论交流!