我们在做项目的过程中,有一些所有项目都会用到的服务性的东西,如工厂,connection, session,对象,事务等。这些在任何项目中都需要用到,都需要手动重新编写代码。
spring是一个轻量级容器架构,将以上所有项目通用的服务提取出来,做成容器,之后每次需要用到这些服务的时候,直接交给spring管理,开发人员不用再手动编写代码。
接下来我们详细介绍下用 spring 来管理对象:
1. Java中对于对象的处理过程:
(1) new ------手动编写代码
(2) 通过工厂 new -------手动编写代码
(3) 通过动态代理 --------手动编写代码
(4) spring IOC 框架 -------将对象交给 spring 来处理,开发者不用关注对象的具体处理过程,不用编写大量代码
2. idea中使用 spring 的过程:
(1)引入 spring 依赖包 ------- spring.jar log4j.jar
(2)配置配置文件 applicationContext.xml
(3)用构造函数或者 set 的方式,注入对象
(4) 用 BeanFactory去查找配置文件
我们用代码来演示:
//接口: UserDao.java
public interface UserDao {
public void getLogin(String username, String password);
}
//UserDao 的实现类 UserDao4sql.java
public class UserDao4sql implements UserDao {
@Override
public void getLogin(String username, String password) {
System.out.println("UserDao4sql.getLogin");
}
}
UserDao 的实现类 User4Oracle.java
public class User4Oracle implements UserDao {
@Override
public void getLogin(String username, String password) {
System.out.println(User4Oracle.getLogin);
}
}
//接口 ManagerTester.java
public interface ManagerTester {
public void addUser(String username, String password);
}
// ManagerTester的实现类 ManagerImmpl.java
public class ManagerImmpl implements ManagerTester {
private UserDao userDao;
//构造器的形式注入
public ManagerImmpl(UserDao userDao) {
this.userDao = userDao;
}
//set的形式注入 -------与构造器方式二选一, set注入是最推荐方式
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void addUser(String username, String password) {
userDao.getLogin(username,password);
}
}
//spring配置文件 applicationContext.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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans"
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd">
//真正需要配置的对象对应关系
//id只是一个标识名,可以随便写
<bean id="UserDao4sql" class="*.*.*.UserDao4sql"/>
<bean id="UserDao4Oracle" class="*.*.*.UserDao4Oracle"/>
<bean id="ManagerTester" class="*.*.*.ManagerImmpl">
//用构造器的方式注入 配置
<constructor-arg ref="UserDao4sql"/>
//用 set的方式注入 配置
<property name="userDao" ref="UserDao4sql"/>
</bean>
需要注意的两点,第一点是配置文件的配置,第二点是注入的方式。
//测试类 Client.java
public class Client {
public static void main(String[] args) {
BeanFactory bean = new ClassPathXmlApplicationContext("applicationContext.xml");
ManagerTester managerTester = (ManagerTester )bean.getBean("ManagerTester ");
managerTester .addUser("zhangsan","123456");
}
}
spring的核心点有两点,一个是 AOP 一个是 IOC,IOC指的是控制反转,也就是说所有东西都交给spring管理,不用在代码中显示编写代码,代码中需要的话, spring自动注入进去就行。AOP指的是声明式服务,也就是说所有的管理过程都配置在配置文件中,不用编写到代码中。AOP的底层实现式 JDK 的动态代理。横向切面服务就指的是将所有共有的小服务都拿出来,放在容器中,需要用的时候由spring主动给你。