一.六大模块
- Spring Core spring的核心功能: IOC容器, 解决对象创建及依赖关系
-
Spring Web Spring对web模块的支持。
- 可以与struts整合,让struts的action创建交给spring
- spring mvc模式
- Spring DAO Spring 对jdbc操作的支持 【JdbcTemplate模板工具类】
-
Spring ORM spring对orm的支持:
- 既可以与hibernate整合,【session】
- 也可以使用spring的对hibernate操作的封装
- Spring AOP 切面编程
- SpringEE spring 对javaEE其他模块的支持
二.搭建配置环境
jar:
- commons-logging-1.1.3.jar 日志
- spring-beans-3.2.5.RELEASE.jar bean节点
- spring-context-3.2.5.RELEASE.jar spring上下文节点
- spring-core-3.2.5.RELEASE.jar spring核心功能
- spring-expression-3.2.5.RELEASE.jar spring表达式相关表
bean.xml:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
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.xsd">
</beans>
三.得到容器对象
spring的容器,可以归类为两种类型
- Bean工厂,BeanFactory【功能简单】
- 应用上下文,ApplicationContext【功能强大,一般我们使用这个】
通过Resource获取BeanFactory
- 加载Spring配置文件
- 通过XmlBeanFactory+配置文件来创建IOC容器
//加载Spring的资源文件
Resource resource = new ClassPathResource("applicationContext.xml");
//创建IOC容器对象【IOC容器=工厂类+applicationContext.xml】
BeanFactory beanFactory = new XmlBeanFactory(resource);
通过类路径获取ApplicationContext
// 得到IOC容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println(ac);
在Spring中总体来看可以通过三种方式来配置对象:
- 使用XML文件配置
- 使用注解来配置
- 使用JavaConfig来配置
3.1xml配置方式
在上面我们已经可以得到IOC容器对象了。接下来就是在applicationContext.xml文件中配置信息【让IOC容器根据applicationContext.xml文件来创建对象】
- 首先我们先有个JavaBean的类
public class User {
private String id;
private String username;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
- 创建bean
<!--
使用bean节点来创建对象
id属性标识着对象
name属性代表着要创建对象的类全名
-->
<bean id="user" class="User"/>
- 在外界通过IOC容器对象得到User对象
// 得到IOC容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) ac.getBean("user");
System.out.println(user);
上面我们使用的是IOC通过无参构造函数来创建对象,我们来回顾一下一般有几种创建对象的方式:
- 无参构造函数创建对象
- 带参数的构造函数创建对象
-
工厂创建对象
- 静态方法创建对象
- 非静态方法创建对象
3.2带参构造函数创建对象
首先bean应该带有有参构造方法
<bean id="user" class="User">
<!--通过constructor这个节点来指定构造函数的参数类型、名称、第几个-->
<constructor-arg index="0" name="id" type="java.lang.String" value="1"></constructor-arg>
<constructor-arg index="1" name="username" type="java.lang.String" value="zhongfucheng"></constructor-arg>
</bean>
3.3静态工厂方法
首先,使用一个工厂的静态方法返回一个对象
public class Factory {
public static User getBean() {
return new User();
}
}
<!--工厂静态方法创建对象,直接使用class指向静态类,指定静态方法就行了-->
<bean id="user" class="Factory" factory-method="getBean" >
</bean>
3.4非静态工厂方法
public class Factory {
public User getBean() {
return new User();
}
}
<!--首先创建工厂对象-->
<bean id="factory" class="Factory"/>
<!--指定工厂对象和工厂方法-->
<bean id="user" class="User" factory-bean="factory" factory-method="getBean"/>
3.5注解方式
通过注解来配置信息就是为了简化IOC容器的配置,注解可以把对象添加到IOC容器中、处理对象依赖关系,我们来看看怎么用吧:
使用注解步骤:
-
1)先引入context名称空间
- xmlns:context="http://www.springframework.org/schema/context"
-
2)开启注解扫描器
<context:component-scan base-package=""></context:component-scan>
- 第二种方法:也可以通过自定义扫描类以@CompoentScan修饰来扫描IOC容器的bean对象。
创建对象以及处理对象依赖关系,相关的注解:
- @ComponentScan扫描器
- @Configuration表明该类是配置类
- @Component 指定把一个对象加入IOC容器--->@Name也可以实现相同的效果【一般少用】
- @Repository 作用同@Component; 在持久层使用
- @Service 作用同@Component; 在业务逻辑层使用
- @Controller 作用同@Component; 在控制层使用
-
@Resource 依赖关系
- 如果@Resource不指定值,那么就根据类型来找,相同的类型在IOC容器中不能有两个
- 如果@Resource指定了值,那么就根据名字来找
package aa;
import org.springframework.stereotype.Repository;
//把对象添加到容器中,首字母会小写
@Repository
public class UserDao {
public void save() {
System.out.println("DB:保存用户");
}
}
package aa;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
//把UserService对象添加到IOC容器中,首字母会小写
@Service
public class UserService {
//如果@Resource不指定值,那么就根据类型来找--->UserDao....当然了,IOC容器不能有两个UserDao类型的对象
//@Resource
//如果指定了值,那么Spring就在IOC容器找有没有id为userDao的对象。
@Resource(name = "userDao")
private UserDao userDao;
public void save() {
userDao.save();
}
}
package aa;
import org.springframework.stereotype.Controller;
import javax.annotation.Resource;
//把对象添加到IOC容器中,首字母会小写
@Controller
public class UserAction {
@Resource(name = "userService")
private UserService userService;
public String execute() {
userService.save();
return null;
}
}
3.6通过Java方式
由于Spring的自动装配并不能将第三方库组件装配到应用中,于是需要显式装配配置。显示装配有两种方式
- 通过java代码装配bean
- 通过XML装配bean
Spring In Action作者首推使用自动装配的功能,而后是通过java代码配置bean,最后才用XML文件配置的方式..
那么怎么通过java代码来配置Bean呢??
- 编写一个java类,使用@Configuration修饰该类
- 被@Configuration修饰的类就是配置类
使用配置类创建bean:
- 使用@Bean来修饰方法,该方法返回一个对象。
- 不管方法体内的对象是怎么创建的,Spring可以获取得到对象就行了。
- Spring内部会将该对象加入到Spring容器中
- 容器中bean的ID默认为方法名
@org.springframework.context.annotation.Configuration
public class Configuration {
@Bean
public UserDao userDao() {
UserDao userDao = new UserDao();
System.out.println("我是在configuration中的"+userDao);
return userDao;
}
}