目录
1. 什么是spring,它能够做什么?
2. 什么是控制反转(或依赖注入)
3. AOP的关键概念
4. 示例
4.1 创建工程
4.2 pom文件
4.3 spring配置文件
4.4 示例代码
4.4.1 示例1
4.4.2 示例2 (abstract,parent示例)
4.4.3 使用有参数构造方法创建javaBean
4.4.4 init-method:指定bean的初始化方法
4.4.5 复杂属性的配置
5. 多配置文件
6. 与web集成
6.1 集成配置
6.2 获取配置的Bean
Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
Spring项目出发点:
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
控制反转(IoC=Inversion of Control)IoC,用白话来讲,就是由容器控制程序之间的(依赖)关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:(依赖)控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
IoC还有一个另外的名字:“依赖注入 (DI=Dependency Injection)” ,即由容器动态的将某种依赖关系注入到组件之中。
创建一个web工程,并转换为web3.1, 详细步骤可参见“maven”课件
依赖配置如下:
5.2.12.Final
5.1.44
5.2.6.RELEASE
2.5.13
1.7.7
2.9.1
3.2.0
4.12
4.0.1
1.2
1.1.2
8.5.20
junit
junit
4.12
test
org.springframework
spring-core
${spring.version}
org.springframework
spring-context
${spring.version}
org.springframework
spring-orm
${spring.version}
org.springframework
spring-web
${spring.version}
org.springframework
spring-test
${spring.version}
org.springframework
spring-aop
${spring.version}
org.springframework
spring-aspects
${spring.version}
org.springframework
spring-beans
${spring.version}
org.springframework
spring-jdbc
${spring.version}
mysql
mysql-connector-java
${mysql.driver.version}
org.slf4j
slf4j-api
${slf4j.version}
org.slf4j
jcl-over-slf4j
${slf4j.version}
runtime
org.apache.logging.log4j
log4j-slf4j-impl
${log4j.version}
slf4j-api
org.slf4j
org.apache.logging.log4j
log4j-api
${log4j.version}
org.apache.logging.log4j
log4j-core
${log4j.version}
org.apache.logging.log4j
log4j-web
${log4j.version}
runtime
com.lmax
disruptor
${disruptor.version}
junit
junit
${junit.version}
test
javax.servlet
javax.servlet-api
${servlet.version}
provided
javax.servlet.jsp.jstl
jstl
${jstl.version}
taglibs
standard
${standard.version}
org.apache.tomcat
tomcat-jsp-api
${tomcat-jsp-api.version}
provided
注: 该依赖配置不仅包含了spring,同时也包含了hibernate,struts,mysql驱动等。
1) Student
public class Student {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Demo [name=" + name + "]";
}
}
2) spring.xml 配置文件
张三
配置文件说明:
注: 在这里配置的name属性为简单的String属性,可以直接使用value进行配置。另外可以直接使用value设置的如下:
8基础数据+String+3个sql
java.util.Date
java.sql.Date
java.sql.Time
java.sql.Timestamp
3) 通过Spring的ApplicationContext获取Bean
public class SpringDemo {
public static void main(String[] args) {
ApplicationContext cxt = new ClassPathXmlApplicationContext("spring.xml");
Student demo = (Student)cxt.getBean("demo");
System.out.println(demo);
}
}
1) Person
public class Student extends Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Demo [name=" + name + "]";
}
}
2) Student
public class Student extends Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Demo [name=" + name + "]";
}
}
3) 配置文件
张三
139751878778
4) 通过Spring的ApplicationContext获取Bean
public class SpringDemo {
public static void main(String[] args) {
ApplicationContext cxt = new ClassPathXmlApplicationContext("spring.xml");
Student student = (Student)cxt.getBean("student");
System.out.println(student.getName());
System.out.println(student.getPhone());
}
}
constructor-arg
1) Worker
public class Worker extends Person {
private String workName;
public Worker(String workName) {
this.workName = workName;
}
public String getWorkName() {
return workName;
}
public void setWorkName(String workName) {
this.workName = workName;
}
}
2)配置文件
王小
3) 通过Spring的ApplicationContext获取Bean
public class SpringDemo {
public static void main(String[] args) {
ApplicationContext cxt = new ClassPathXmlApplicationContext("spring.xml");
Student student = (Student)cxt.getBean("student");
System.out.println(student.getName());
System.out.println(student.getPhone());
//构造函数注入
Worker worker = (Worker)cxt.getBean("worker");
System.out.println(worker.getWorkName());
}
}
public class Student extends Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Demo [name=" + name + "]";
}
//init方法,不能有参数
public void init() {
System.out.println("Student init ....");
}
}
2) 修改Student类对应的配置文件
张三
3) 运行原来的测试用例,会发生后台打印“Student init ....“,表示init-method正常调用。
1) JavaBean属性注入
张三
长沙
java部分代码比较简单,请根据配置文件自行完成。
2)List或数组
声明属性
private int[] arr;
private List list;
配置文件
123
456
789
asd
3)Map
private Map map;
配置文件
4.Properties
private Properties prop;
配置文件
qwer
tyu
iop
系统一般会被分成多个模块,可以为每个模块配置一个配置文件,便于管理,在版本控制软件中也可以减少冲突
spring-a.xml 假设为a模块的配置文件
张三
长沙
139751878778
王小
spring.xml 为总的spring配置文件, 在总配置文件中导入其他模块即可。
在web.xml中加入如下配置:
contextConfigLocation
classpath:spring.xml
org.springframework.web.context.ContextLoaderListener
/**
* 用于简化Bean的获取.
*
* ApplicationContextAware接口:
* 实现了这个接口的bean,当spring容器初始化的时候,会自动的将ApplicationContext注入进来
*
* @author Administrator
*/
public final class SpringBeanUtil implements ApplicationContextAware {
private SpringBeanUtil() {
}
private static ApplicationContext cxt;
@Override
public void setApplicationContext(ApplicationContext appContext) throws BeansException {
cxt = appContext;
}
/**
* 根据Bean的id来获取Bean对象
* @param id 配置文件中的bean的id属性
* @return Object
*/
@SuppressWarnings("unchecked")
public static T getBean(String id) {
return (T)cxt.getBean(id);
}
}
配置文件