1、Spring介绍
通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
2、Spring思想的核心
1、IOC控制反转
IOC(Inversion Of Control)可以减少代码的耦合问题。控制反转一般分为两种类型,依赖注入(Dependency injection)和依赖查找(Dependency loopup)。
1、IOC可以算是一种设计模式。
2、IOC可以看做是工厂模式的升华,可以把IOC看作一个大的工厂。在这个工厂中要生成的对象都是在XML文件中配置的。然后利用反射,获取XML类名中的对象,生成。从而把我们在java中一般需要new出来的对象,交给Spring来处理。提高代码的灵活性。
3、IOC的本质实现是用java的反射,在运行时期获取字段,生成对象,也可以得到对象的属性和方法。
反射在框架中应用广泛,像Hibernate,Spring很多地方都是通过运用反射来实现的。
IOC的优缺点
优点:
代码解耦,把生成对象放在xml中。
缺点:
- 生成一个对象的步骤变复杂了(事实上操作上还是挺简单的)
- 使用反射,性能损耗。但相对于IoC提高的维护性和灵活性来说,这点损耗是微不足道的,除非某对象的生成对效率要求特别高。
- 缺少IDE重构操作的支持,如果在Eclipse要对类改名,那么你还需要去XML文件里手工去改了,这似乎是所有XML方式的缺憾所在。
2、DI依赖注入
DI(Denpendency injection)IOC思想的核心。其实也就是IOC思想内部的具体实现。
当我们在一个java类中,需要使用另一个java类中,我们需要new也实例。但在Spring中,创建被调用的类不在由调用类来完成,因此成为反转。创建者被调用的实例化,由Spring来完成,然后注入到调用者中,也就是注入。
示例
依赖:A类使用B类,我们就成A类依赖与B类。
依赖注入:A类使用B类,将自动创建B类实例,自动设置给A类
例如:UserService 需要使用 UserDao,当从spring容器获得UserService时,spring将自动的创建UserDao,并设置给UserService。此时UserService不需要任何操作就可以使用UserDao。
3、AOP切面编程
AOP(Aspect Oriented Programming)面向切面编程。通过预编译方式和运行期动态代理实现程序功能的统一维护。
AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
1、这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
2、将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
AOP其实是将琐碎的事务和逻辑代码相分离,以便我们更好的关注逻辑代码
代码逻辑比如是插入一条数据,那么琐碎事务就包括获取连接和关闭连接,事务开始,事务提交。
切面就是指在大堆繁琐事务中的逻辑代码。
2、Spring的好处
3、Spring框架
Spring的核心组件:
beans,core,context,el
4、入门Demo
1.导jar包
2.测试java类,User类
3.beans.xml文件配置
4.单元测试
示例代码如下
1、User类
package com.exmaple.spring;
public class User {
public void hello(){
System.out.println("hello my spring");
}
}
2、配置文件
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!-- 将对象配置给spring,id唯一名称,class为实现类全限定类名 -->
<bean id="userId" class="com.exmaple.spring.User"></bean>
</beans>
3、测试代码
package com.exmaple.spring;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSpring {
// 不通过Spring代码
@Test
public void testHello() {
User user = new User();
user.hello();
}
// 通过使用Spring代码如下
@Test
public void testHelloSpring() {
// /SpringDemo/src/com/exmaple/spring/beans.xml
String xmlPath = "com/exmaple/spring/beans.xml";
//获取Srping容器
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
xmlPath);
//通过容器获取配置文件中id,获取实例
User user = (User) applicationContext.getBean("userId");
//调用实例中的方法
user.hello();
}
}
示例2
1、BookDao和BookDaoImpl代码
package com.exmaple.spring2;
public interface BookDao {
void save();
}
package com.exmaple.spring2;
public class BookDaoImpl implements BookDao{
public void save() {
// TODO Auto-generated method stub
System.out.println("save book");
}
}
2、BookService和BookServiceImpl代码
package com.exmaple.spring2;
public interface BookService {
public void addBook();
}
package com.exmaple.spring2;
public class BookServiceImpl implements BookService {
private BookDao bookDao;
//依赖注入,service使用dao将由工厂自动创建并设置。提供接口对应setter方法
public void setBookDao(BookDao bookDao){
this.bookDao=bookDao;
}
public void addBook() {
// TODO Auto-generated method stub
this.bookDao.save();
}
}
3、beans.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 将对象配置给spring,id唯一名称,class为实现类全限定类名 -->
<bean id="bookServiceId" class="com.exmaple.spring2.BookServiceImpl">
<!-- 给指定bean的属性,确定设置的内容 * name : 表示 bean的属性名称(通过setter获得) * ref : 引用,表示
引用spring容器已经配置好的其他bean -->
<property name="bookDao" ref="bookDaoId"></property>
</bean>
<bean id="bookDaoId" class="com.exmaple.spring2.BookDaoImpl"></bean>
</beans>
最后测试代码
public class TestSpring {
// 不通过Spring代码
// 通过使用Spring代码如下
@Test
public void testHelloSpring() {
// /SpringDemo/src/com/exmaple/spring/beans.xml
String xmlPath = "com/exmaple/spring2/beans.xml";
// 获取Srping容器
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
xmlPath);
// 通过容器获取配置文件中id,获取实例
BookService bookService = (BookService) applicationContext
.getBean("bookServiceId");
// 调用实例中的方法
bookService.addBook();
}
}
Spring学习二(Bean的配置)
http://blog.youkuaiyun.com/androidxiaogang/article/details/52662322
参考
http://blog.youkuaiyun.com/taijianyu/article/details/2338311/