一、阐述:
IoC:我们以前写的框架虽然我们已经进行分层,web、业务层、持久层。但是各个层之间的关系。耦合性比较高,那个层调用其他层的时候,需要new对应层的类的对象,这样的话,我们以后做修改的时候,需要更改各个层的调用。
耦合性比较高,不利于维护。
而Spring提出一个IoC的方式管理各个层的资源。
IoC:inverse of control(控制反转),也就是各个资源的实例的话权限交给spring框架。
底层也是通过工厂模式,通过配置文件方式,将每层需要的资源注入到各个层中。这种方式的开发是目前主流的开发方式。
新老旧对比:
二:入门
1)准备工作:
spring版本:spring-framework-4.2.4.RELEASE-dist.zip
下载地址:http://repo.springsource.org/libs-release-local/org/springframework/spring/
包说明:
1:spring依赖的包,比如说需要导入其他的包,common.io 。。。这个包里有。
2:是spring框架使用需要的包。
其中lib里有我们需要的jar包
这里jar包都是3个:
第一个是我们使用的jar包。
第二个是是文档jar包。
第三个是源码jar包。
3:第三个是我们使用的文档j压缩包。
2)导入的jar包:我们先看下spring的结构
核心core container:是底层spring 核心容器是(IoC部分)实现任何功能都需要这个核心容器,分别是:Beans配置、Core、Context、以及表达式。
分别对应下面jar包:
导入如上jar包。
日志jar包:
1:是日志规范
2:是日志实现类。
如果在运行的时候报错 文件名太长,请修改目录的文件名字即可。
日志配置文件:log4j.properites 将日志配置文件拷贝到src下面。
配置文件:
1 ### direct log messages to stdout ### 2 log4j.appender.stdout=org.apache.log4j.ConsoleAppender 3 log4j.appender.stdout.Target=System.err 4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 5 log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n 6 7 ### direct messages to file mylog.log ### 8 log4j.appender.file=org.apache.log4j.FileAppender 9 log4j.appender.file.File=c:mylog.log 10 log4j.appender.file.layout=org.apache.log4j.PatternLayout 11 log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n 12 13 ### set log levels - for more verbose logging change 'info' to 'debug' ### 14 15 log4j.rootLogger=info, stdout
使用日志:
测试类:通过静态方法getLogger获取日志的对象。
1 package jd.com.log4jtest; 2 3 4 import org.apache.log4j.Logger; 5 import org.junit.Test; 6 7 public class log4jTest { 8 private Logger logger=Logger.getLogger(log4jTest.class); 9 @Test 10 public void test(){ 11 logger.info("输出日志了。"); 12 } 13 14 }
格式:log4j+class名称。
3)IoC实例:
配置文件:applicationContext.xml 名字没有固定但是一般都起这个名字。
文件内容:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation=" 5 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 6 7 <bean id="userservice" class="jd.com.IoC.UserServiceImpl"/> 8 9 </beans>
1、首先约束:在解压包里:spring-framework-4.2.4.RELEASE-distspring-framework-4.2.4.RELEASEdocsspring-framework-referencehtml内的html文件:xsd-configuration.html 打开网页在网页的最下面有bean的约束就IoC的约束:
标签bean,内的属性di和class。id是调用的时候名称,需要唯一。class是哪个类需要spring管理。是类的全路径。xml文件放在src下面。
接口:ApplicationContext的实现类ClassPathXmlApplicationContext 参数是xml文件路径。
代码:(以后再写类的时候,最好写一个接口,一个实现类的形式。)
接口:
1 package jd.com.IoC; 2 3 public interface UserSerivce { 4 void sayOk(); 5 }
实现类:
1 package jd.com.IoC; 2 3 public class UserServiceImpl implements UserSerivce { 4 @Override 5 public void sayOk() { 6 System.out.println("OK"); 7 } 8 }
测试方法:
1 package jd.com.IoC; 2 3 4 import org.junit.Test; 5 import org.springframework.context.ApplicationContext; 6 import org.springframework.context.support.ClassPathXmlApplicationContext; 7 8 public class Testemo { 9 @Test 10 public void testUserService(){ 11 UserSerivce userSerivce= new UserServiceImpl(); 12 userSerivce.sayOk(); 13 } 14 @Test 15 public void testUserService1(){ 16 ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml"); 17 UserServiceImpl userSerivc= (UserServiceImpl) ac.getBean("userservice"); 18 userSerivc.sayOk(); 19 } 20 21 22 @Test 23 public void testUserService2(){ 24 ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml"); 25 UserSerivce userSerivce= (UserSerivce) ac.getBean("userservice"); 26 userSerivce.sayOk(); 27 } 28 29 30 }
这里有三个测试方法:
1、是传统以前使用的方法,哪个类在使用哪个资源的时候,哪个类有控制该资源的权限。
2、使用的实现类的方式。
3、使用接口的方式。
推荐第三种方式。原因,如果接口有多个实现类,在调用的时候无需写多个调用方法。