前面我们简单介绍了一个spring.我们这里主要用spring framew这个框架.主要处理业务逻辑层.我们发现理论恨多,但是其实开发起来代码是很简单的.我们来说一个入门案例.
这里说的入门案例,主要想说下ioc: 控制反转,将对象创建和依赖管理的权限反转给spring容器.这不是第一次强调这个东西了.我们这里再重复一下,就当是强调了.不要嫌我啰嗦.这个思想很重要.
以前我们创建对象都是我们手动人工的new出来,这里呢我们就不需要new了,交给容器,不由我们创建了.对象的生命周期也由容器管理了.我们使用spring后,由于ioc,我们已经将对象的创建和管理的权限交出去了,如果我们需要对象,通过依赖来实现注入,从容器中获取
如果A里面要依赖B,如何实现的呢?这里有下面的一个DI:依赖注入,对依赖的管理 我们在运行过程中,动态实现给它的依赖,实现值的注入
下面介绍一下这个案例的步骤:
- 创建java项目
- 导入响应jar包 spring是模块化的,所以只需要导入我们需要的jar包即可,没必要全部导入
- ioc就是由前面说的第一组来实现的,所以需要核心容器的jar + Commons-logging (日志增强的) 4+1
- 日志增强的jar包一个是可以去Apache获取,另外一个我们以前mybatis的lib中有
- 这里我们主要以与数据持久层交互的案例来举例子,但是我们着重要说的是如何用spring框架创建对象和管理
- UserDao 数据持久层
- UserDaoImpl
- 导入响应jar包 spring是模块化的,所以只需要导入我们需要的jar包即可,没必要全部导入
- ①.我们先写一下传统的,也就是咱们之前的 .下面看一下代码
- 首先我们在src下创建一个dao的包,创建一个UserDao的接口.像我们之前一样.但是这里我们就是模拟一下,不连接数据库了
package dao; public interface UserDao { void addUser(); void deleteUser(); }
然后我们在dao包下,创建一个impl的子包,里面是UserDao接口的实现类UserDaoImpl
-
package dao.impl; import dao.UserDao; public class UserDaoImpl implements UserDao { @Override public void addUser() { System.out.println("添加用户"); } @Override public void deleteUser() { System.out.println("删除用户"); } }
这和我们之前一样.我们先来写个测试类.src下创建一个test包,里面创建测试类Test
-
package test; import dao.UserDao; import dao.impl.UserDaoImpl; public class Test { public static void main(String[] args) { UserDao dao = new UserDaoImpl(); dao.addUser(); dao.deleteUser(); } /* *输出结果: *添加用户 *添加用户 */ }
这就是我们之前传统的创建dao和数据交互的模拟.这里我们创建和管理对象的权限都在我们开发者手上,刚才我么说了spring是一个容器,它的ioc是让我们将对象的创建和管理都交给容器那就意味着我们这里创建dao对象,不应该直接new了.应该转变成从spring容器中获取.既然要获取,那spring容器中应该先创建和管理dao对象..如何创建的呢..就是通过配置文件.
-
下面我们来配置一下这个配置文件,在src目录下,我们创建一个applicationContext.xml的配置文件.如下配置
<?xml version="1.0" encoding="UTF-8"?> <!-- 这个文件的名字不是一定要叫这个,而是习惯性都叫这个而已 ,在这里面我们来配置一下这个spring容器 那如何配置呢?我们还是要参考一下开发指南. xsd是什么呢?以前我们说过约束文件一种是dtd,还有一种是schema.这个约束它的后缀名字就是xsd 发开指南The equivalent file in the XML Schema-style would be…这局下面的约束我们copy到下面 用下面这些约束来约束beans这个标签里面的标签有什么和如何写 --> <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标签代表配置管理一个对象,这里我们要用bean来创建和管理UserDao的对象 id:这个对象的唯一标识 class:类的完全限定名称 --> <bean id="userdao" class="dao.impl.UserDaoImpl"></bean> <!--这里要注意,上面class中传入的是实现类的对象,因为既然要帮我们创建对象, 我们传入个接口,接口不能创建对象.肯定是不行的 --> </beans>
此时我们回到测试类:用spring工厂模式创建对象.
-
package test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import dao.UserDao; public class Test { public static void main(String[] args) { /* * 刚才我们已经在配置文件中配置了让spring容器帮我们创建对象,我们这里要拿到这个对象 */ //这个spring ioc容器实际上就是ApplicationContext,加载上线问来获取这个容器对象 ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); //从容器中取对象,那容器中有很多对象的话,通过什么来取呢?就是我们前面<bean>标签里面的id //ApplicationContext 的getBean(String name,Class<T> requiredType) //name就是<bean>中的id;requiredType 是返回对象的类型 UserDao dao = ac.getBean("userdao", UserDao.class); dao.addUser(); dao.deleteUser(); } }
输出结果:
-
十月 26, 2018 9:14:47 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7e6cbb7a: startup date [Fri Oct 26 21:14:47 CST 2018]; root of context hierarchy 十月 26, 2018 9:14:47 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息: Loading XML bean definitions from class path resource [applicationContext.xml] 添加用户 删除用户
这样我们就实现了用spring工厂模式创建我们需要对象.我们发现,我们没有再手动new我们需要的对象了,而是用方法调用的模式来实现的.这样耦合就变低了.
- 首先我们在src下创建一个dao的包,创建一个UserDao的接口.像我们之前一样.但是这里我们就是模拟一下,不连接数据库了