一、IOC
Spring的两大核心机制是IOC(控制反转)和AOP(面向切面编程),
IOC是典型的工厂模式,通过工厂去注入对象。
AOP则是代理模式的体现。
现在我们来详细了解IOC,IOC是Spring框架的灵魂,非常重要,理解了IOC才能掌握Spring框架如何使用。IOC也叫控制反转,首先从字面意思理解,什么叫控制反转?反转的是什么?
在传统的程序开发中,需要调用对象时,通常由调用者来创建被调用者的实例,即对象是由调用者主动new出来的。但是在Spring框架中创建对象的工作不再由调用者来完成,而是交给IOC容器来创建,再推送给调用者,整个流程完成反转,所以称为控制反转。
简单来说就是:ioc中对象的创建不是通过new方式实现,而是交给Spring进行配置来创建类的对象,把对象的创建交给Spring进行管理。
二、传统方式
1.创建Student类
public class Student {
private int id;
private String name;
public Student() {
super();
}
public Student(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.测试方法中调用构造函数创建对象。
public class Test {
public static void main(String[] args) {
Student student = new Student();
System.out.println(student);
}
}
三、通过IOC来创建对象
1.添加Spring相关jar包
2.创建配置文件applicationContext.xml
3.调用API
首先在配置文件中配置bean标签,IOC容器通过加载bean标签来创建对象。
再调用API获取IOC创建的对象。
IOC容器可以调用无参构造或者有参构造来创建对象,我们先来看无参构造的方式。
<?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">
<!-- 配置student对象-->
<bean id="student" class="com.cf.entity.Student"></bean>
</beans>
1.配置一个bean标签:
id:对象名。
class:对象的模板类。
2.调用API获取对象
Spring提供了两种方式来获取对象:通过id或者运行时类。
1.通过id获取对象
第一步:加载applicationContext.xml配置文件,生成ApplicationContext对象。
第二步:调用ApplicationContext的getBean方法来获取对象,参数为配置文件中的id值。程序在加载applicationContext.xml时创建student对象,通过反射机制调用无参构造函数,所有要求交给IOC容器管理的类必须有无参构造函数。
public class Test {
public static void main(String[] args) {
//1.加载spring.xml配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.通过id值获取对象
Student student= (Student) applicationContext.getBean("student");
System.out.println(student);
}
}
四、Spring的bean管理(xml方式)
1、在Spring里面通过配置文件创建对象就是bean实例化
2 、bean实例化三种方式实现(重点掌握第一种,后两种了解即可)
第一种 使用类的无参数构造创建(重点)
如果没有写无参的构造,会默认有一个无参的构造。如果写了有参的构造就必须有无参数的构造。类里面没有无参数的构造,出现异常。
第二种 使用静态工厂创建
(1)创建静态的方法,返回类对象
第三种 使用实例工厂创建
(1)创建不是静态的方法,返回类对象
bean标签常用属性
(1)id属性:起的对象的名称,id属性值名称可以任意命名。但是id属性值不能包含特殊符号,不能写中文。根据id值得到配置对象。
(2)class属性:创建对象所在类的全路径
(3)name属性:功能和id属性一样的,id属性值不能包含特殊符号,但是在name属性值里面可以包含特殊符号。name现在已经不用了(struts1中用name,现在基本上都用struts2)
(4)scope属性(后面三个一般都不用)
singleton:这个是默认值,单例的,对象只能创建一次。
如果创建了两个对象,地址是一样的,其实是一个对象。
prototype:多例的,每次创建都是一个新的对象
public class Test {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
User user1 = (User) applicationContext.getBean("user");
User user2 = (User) applicationContext.getBean("user");
User user3 = (User) applicationContext.getBean("user");
System.out.println(user1 == user2);
System.out.println(user1);
System.out.println(user2);
System.out.println(user3);
}
}
request:创建对象把对象放到request域里面
session:创建对象把对象放到session域里面
globalSession:创建对象把对象放到globalSession里面。globalSession,全局的session,比如百度 登录百度贴吧,访问百度文库的时候就不需要再次登录一次,这就是一个全局的操作。(单点登录 redis)
五、属性注入介绍
1 属性注入
创建对象时候,向类里面属性里面设置值
比如说有一个类User,里面有一个属性username,现在想要在创建对象的时候向属性username注入属性值fafa。
2 属性注入的方式介绍(三种方式) 在java中
(1)使用set方法注入(重点)
(2)使用有参数构造注入
(3)使用接口注入(一般不用)
在Spring框架里面,支持前两种方式
注入复杂类型属性
1数组
2 list集合
3 map集合
4 properties类型 文件是键值对类型 注意Properties要导java.util中的包
<!-- 注入复杂类型属性值 -->
<bean id="person" class="cn.cf.entity.Person">
<!-- 数组 -->
<property name="arrs">
<list>
<value>张三</value>
<value>李四</value>
<value>王五</value>
</list>
</property>
<!-- list -->
<property name="list">
<list>
<value>张三</value>
<value>李四</value>
<value>王五</value>
</list>
</property>
<!-- map -->
<property name="map">
<map>
<entry key="aa" value="lucy"></entry>
<entry key="bb" value="mary"></entry>
<entry key="cc" value="tom"></entry>
</map>
</property>
<!-- properties -->
<property name="properties">
<props>
<prop key="driverclass">com.mysql.jdbc.Driver</prop>
<prop key="username">root</prop>
</props>
</property>
</bean>
六、Spring读取外部资源
一般开发中,数据库的配置会保存在一个properties文件中,便于维护,如果使用Spring容器来生成数据源对象,如何读取到properties配置文件中的内容?
1.创建jdbc.properties
driverName = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/Spring?useUnicode=true&characterEncoding=UTF-8
user = root
password= root
2.spring.xml中配置C3P0数据源
第一步:导入外部资源文件。
使用context:property-placeholder标签,需要导入context命名空间。
第二步:通过${}表达式取出外部资源文件的值。
<?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-4.0.xsd">
<!-- 导入外部的资源文件 -->
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<!-- 创建C3P0数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="user" value="${user}"></property>
<property name="password" value="${password}"></property>
<property name="driverClass" value="${driverName}"></property>
<property name="jdbcUrl" value="${url}"></property>
</bean>
</beans>