1. Spring简介
1.1 Spring的优点
- 轻量级框架
- IOC容器:控制反转
- AOP切面:面向切面编程
- 对事务的支持
- 对框架的支持
1.2 Spring主要内容
Spring主要内容1.3 IOC:inversion of control 控制反转
- 对象由原来的程序本身创建变为了程序接收对象。
- 程序员主要精力集中于业务实现
- 实现了service层和dao层的解耦工作:service层和dao层没有直接以来关系,如果dao层的实现发生改变,应用本身不变。
2.Spring入门和IOC
2.1 Hello,Spring
-
导入相关jar包
相关jar包 - 编写spring配置文件(beam.xml)
<?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 name="hello" class="com.yxxy.bean.Hello">
<property name="name" value="spring"></property>
</bean>
</beans>
- 编写Hello.java
public class Hello {
private String name;
public void setName(String name) {
this.name = name;
}
public void show() {
System.out.println("hello" + name);
}
}
- 测试
public class Test {
public static void main(String[] args) {
// 解析beans.xml文件 生成管理相应的bean对象
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Hello hello = (Hello) context.getBean("hello");
hello.show();
}
}
- 总结:上述的内容就叫做控制反转
①控制的内容:指谁来控制对象的创建,传统应用的对象创建是程序本身,使用sping后,sping可以控制对象的创建。
②反转:由主动创建对象变为被动接收。
③控制反转——依赖注入。
④IOC的实现是由ioc容器实现的:BeanFactory。
2.2 IOC创建对象的3中方式
- 通过无参构造方法创建
User.java
public class User {
private String name;
public User() {
System.out.println("User的无参构造方法!");
}
public void show() {
System.out.println("name=" + name);
}
}
bean.xml
<bean name="user" class="com.yxxy.vo.User">
<property name="name" value="张三"></property>
</bean>
- 通过有参构造方法创建
User.java
public class User {
private String name;
public User(String name) {
System.out.println("User的有参构造方法!");
this.name = name;
}
public void show() {
System.out.println("name=" + name);
}
}
bean.xml
<!--根据参数下标来设置-->
<bean name="user" class="com.yxxy.vo.User">
<constructor-arg index="0" value="李四"></constructor-arg>
</bean>
<!--根据参数名称来设置-->
<bean name="user" class="com.yxxy.vo.User">
<constructor-arg name="name" value="王五"></constructor-arg>
</bean>
<!--根据参数类型来设置-->
<bean name="user" class="com.yxxy.vo.User">
<constructor-arg type="java.lang.String" value="Dylan"></constructor-arg>
</bean>
- 通过工厂方法来创建
- 静态工厂对象
public class UserStaticFactory {
public static User newInstance(String name) {
return new User(name);
}
}
bean.xml
<bean id="user" class="com.yxxy.factory.UserStaticFactory" factory-method="newInstance">
<constructor-arg index="0" value="张三"></constructor-arg>
</bean>
- 动态工厂对象
public class UserDynamicFactory {
public User newInstance(String name) {
return new User(name);
}
}
- Beans.xml
<!--需要定义一个工厂的bean-->
<bean id="userDynamicFactory" class="com.yxxy.factory.UserDynamicFactory"></bean>
<!--需要使用factorybean,然后再指定工厂方法-->
<bean id="user" factory-bean="userDynamicFactory" factory-method="newInstance">
<constructor-arg index="0" value="张三"></constructor-arg>
</bean>
3. Spring的配置文件详解
3.1 alias别名
alias:为bean设置别名,bean可以设置多个别名
<!-- 设置别名 单个设置 -->
<alias name="user" alias="u1"/>
<!-- 设置多个别名 -->
<bean id="user" name="u2,u3 u4;u5" class="com.yxxy.vo.User">
<property name="name" value="张三"></property>
</bean>
3.2 bean的配置
<!--
id是bean的标识符要唯一,如果没有配置id,name默认是标识符
如果配置了id,又配置了name,那么name是别名
name可以设置多个别名,分隔符可以是空格逗号分号
class是bean的全限定名=包名+类名
如果不配置id和name,可以根据Class.class获取对象
-->
<bean class="com.yxxy.vo.User">
<property name="name" value="张三"></property>
</bean>
3.3 团队协作开发
<import resource="config/spring/entity.xml"/>
4. 依赖注入
4.1 依赖注入-dependency injection
依赖:指bean对象创建依赖于容器,bean对象的依赖资源。
注入:只bean对象的依赖资源由容器来设置和装配。
4.2 Spring注入:构造器注入
参见ioc创建对象的笔记
4.3 Spring注入:Setter注入
- 常量注入
<bean id="user" class="com.yxxy.vo.User">
<property name="name" value="张三"></property>
</bean>
- bean注入
<!-- bean注入 -->
<property name="address" ref="addr"></property>
- 数组注入
<!-- 数组注入 -->
<property name="books">
<array>
<value>红楼梦</value>
<value>西游记</value>
<value>三国演义</value>
<value>水浒传</value>
</array>
</property>
- list注入
<!-- list注入 -->
<property name="hobbies">
<list>
<value>足球</value>
<value>篮球</value>
</list>
</property>
- map注入
<!-- map注入 -->
<property name="cards">
<map>
<entry key="中国银行" value="123456"></entry>
<entry>
<key><value>建设银行</value></key>
<value>654321</value>
</entry>
</map>
</property>
- set注入
<!-- set注入 -->
<property name="games">
<set>
value>王者荣耀</value>
<value>炉石传说</value>
<value>LOL</value>
</set>
</property>
- null注入
<!-- null注入 -->
<property name="salary">
<null/>
</property>
- Properties注入
<!-- Properties注入 -->
<property name="info">
<props>
<prop key="学号">20171120001</prop>
<prop key="sex">男</prop>
</props>
</property>
- p命名空间注入
<!-- p命名空间实际就是set注入 -->
<bean id="studentp" class="com.yxxy.vo.Student" p:name="张三" p:age="20"></bean>
- c命名空间注入
<!-- c命名空间实际就是构造器注入 -->
<bean id="studentc" class="com.yxxy.vo.Student" c:name="李四" c:age="22"></bean>
网友评论