一、Spring:春天 --- 给软件行业带来了春天。由Rod Johnson创建。
二、理念:使现有技术更加实用。本身是大杂烩,整合现有的框架技术。
三、Spring优点:
轻量级框架
IoC容器:控制反转
AOP:面向切面编程
对事务的支持
对框架的支持
...
四、主要内容
|
五、IoC --- Inversion of Control(控制反转)
案例1:
publicinterfaceUserDao {
publicvoidgetUser();
}
|
publicclassUserDaoMySqlImplimplementsUserDao
{
publicvoidgetUser()
{
System.out.println("mysql获取用户数据");
}
}
|
publicclassUserDaoOracleImplimplementsUserDao
{
publicvoidgetUser()
{
System.out.println("oracle获取用户数据");
}
}
|
publicinterfaceUserService {
publicvoidgetUser();
}
|
publicclassUserServiceImplimplementsUserService
{
// private UserDao userDao = new UserDaoMySqlImpl();
privateUserDaouserDao=
null;
publicvoidsetUserDao(UserDaouserDao)
{
this.userDao=userDao;
}
publicvoidgetUser()
{
userDao.getUser();
}
}
|
publicclassTest {
publicstaticvoidmain(String[]args)
{
// UserService userService = new UserServiceImpl();
// userService.getUser();
UserServiceImpluserService=newUserServiceImpl();
userService.setUserDao(newUserDaoMySqlImpl());
userService.getUser();
System.out.println("----------------");
userService.setUserDao(newUserDaoOracleImpl());
userService.getUser();
}
}
|
例如现在用MySql写了一个程序,但是用了一段时间以后,由于需要,要改用为Oracle。怎么办呢?如果按照以前的方法,新写一个
OracleDao以后,以前用到MySqlDao的地方全部都要改为使用OracleDao。这样整个程序不仅改的地方多,而且还要重新编译。但
是如果通过IoC的方式就不需要再改变原有代码了,只需要在使用的地方去接收需要的对象就好了。而且这个需要的对象可以通过配置
文件来创建,这样原有代码就不需要做任何修改了。
|
通过案例1:
对象由原来程序本身创建,变为了程序接收对象。
程序员主要精力集中于业务实现。
实现了service和dao的解耦工作。service层和dao层实现了分离。没有直接依赖关系。
如果dao的实现发生改变,应用程序本身不用改变。
案例1使用spring来实现:(加上beans.xml修改Test.java)
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="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">
<beanid="userDaoMySql"class="com.liujie.dao.impl.UserDaoMySqlImpl"></bean>
<beanid="userDaoOracle"class="com.liujie.dao.impl.UserDaoOracleImpl"></bean>
<beanid="userService"class="com.liujie.service.impl.UserServiceImpl">
<!-- ref引用对象(对象是由spring来创建的) -->
<propertyname="userDao"ref="userDaoOracle"></property>
<!-- name="userDao"会去寻找userDaoOracle(即UserDaoOracleImpl)里面的getUserDao方法赋值
-->
</bean>
</beans>
|
publicclassTest {
publicstaticvoidmain(String[]args)
{
//解析beans.xml文件,生成管理相应的bean对象
ApplicationContextcontext=newClassPathXmlApplicationContext("beans.xml");
UserServiceuserService=(UserService)context.getBean("userService");
userService.getUser();
}
}
|
六、Hello Spring
步骤:
导入相关jar包
编写spring配置文件(名称可以自定义)
|
导入jar包
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
Hello.java
publicclassHello {
//用来检查spring是否创建了Hello对象
publicHello() {
System.out.println("hello,被创建");
}
privateStringname;
publicvoidsetName(Stringname)
{
this.name=name;
}
publicvoidshow()
{
System.out.println("hello,"+name);
}
}
beans.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="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容器来创建和管理 -->
<!-- name值可以自定义 -->
<beanname="hello"class="com.liujie.bean.Hello">
<propertyname="name"value="spring"/>
</bean>
</beans>
测试代码
publicclassTest {
publicstaticvoidmain(String[]args)
{
//解析beans.xml文件,生成管理相应的bean对象
ApplicationContextcontext=newClassPathXmlApplicationContext("beans.xml");
Hellohello= (Hello)context.getBean("hello");
hello.show();
}
}
思考?
Hello对象是谁创建的?
Hello对象属性是怎么设置的?
|
Hello对象是由spring容器创建的。
Hello对象属性是由spring容器来设置的。
这个过程就叫控制反转:
控制的内容:指谁来控制对象的创建。传统的应用程序对象的创建是由程序本身来控制的。使用spring后,是由spring来创建对
象的。
反转:正转,指程序来创建对象。反转,指程序本身不去创建对象,而变为被动地接收对象。
|
总结:以前对象是由程序本身来创建,使用spring后,程序变为被动接收spring创建好的对象。 |
控制反转 --- 依赖注入(Dependency Injection,通过setter方法来进行注入的) |
IoC --- 是一种编程思想。由主动编程变为被动接收。 |
IoC的实现是通过IoC容器来实现的。IoC容器 --- BeanFactory
BeanFactorycontext=newClassPathXmlApplicationContext("beans.xml");
ApplicationContextcontext=newClassPathXmlApplicationContext("beans.xml");
|
BeanFactory是ApplicationContext的一个父类。 |