作为一名小白,在最近刚刚学习了SSM框架的使用,现在有点空,就整合一下之前学习到的SpringIOC笔记.
大家可以拿来参考~
概念:
控制反转即 IoC(Inversion of Control),也称为依赖注入,用来降低程序代码之间的耦合度.
补充:依赖的概念:在代码中一般指通过局部变量,方法参数,返回值等建立的对于其他对象的调用关系.例如,A类的方法中, 实例化了B的对象并调用其方法以实现功能, 就是A类依赖于B类.
因为原有的代码很多都高度耦合(存在依赖关系),所以不利于维护和扩展,甚至可能难以测试.所以就引入Spring的依赖注入的概念
IoC可以理解为将对象的创建权交给第三方容器
使用:
第一步:导入jar包(在没有使用maven的情况下一定要导jar包)
包括 ==>
spring-beans-3.2.13.RELEASE.jar
spring-context-3.2.13.RELEASE.jar
spring-core-3.2.13.RELEASE.jar
spring-expression-3.2.13.RELEASE.jar
还有一个log4j-1.2.17.jar和commons-logging-1.2.jar是用来实现第二步的
第二步:配置日志文件 ==> 便于观察Bean实例化过程
为项目添加log4j.properties文件,用来控制日志输出.内容如下
log4j.rootLogger=debug,CONSOLE,file
#log4j.rootLogger=ERROR,ROLLING_FILE
log4j.logger.cn.bdqn=debug
log4j.logger.org.apache.ibatis=debug
log4j.logger.org.mybatis.spring=debug
log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug
log4j.logger.java.sql.PreparedStatement=debug
log4j.logger.java.sql.ResultSet=debug
######################################################################################
# Console Appender \u65e5\u5fd7\u5728\u63a7\u5236\u8f93\u51fa\u914d\u7f6e
######################################################################################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=debug
log4j.appender.CONSOLE.DatePattern=yyyy-MM-dd
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern= - (%r ms) - %d{yyyy-M-d HH:mm:ss}%x[%5p](%F:%L) %m%n
######################################################################################
# Rolling File \u6587\u4ef6\u5927\u5c0f\u5230\u8fbe\u6307\u5b9a\u5c3a\u5bf8\u7684\u65f6\u5019\u4ea7\u751f\u4e00\u4e2a\u65b0\u7684\u6587\u4ef6
######################################################################################
#log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
#log4j.appender.ROLLING_FILE.Threshold=INFO
#log4j.appender.ROLLING_FILE.File=${baojia.root}/logs/log.log
#log4j.appender.ROLLING_FILE.Append=true
#log4j.appender.ROLLING_FILE.MaxFileSize=5000KB
#log4j.appender.ROLLING_FILE.MaxBackupIndex=100
#log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
#log4j.appender.ROLLING_FILE.layout.ConversionPattern=%d{yyyy-M-d HH:mm:ss}%x[%5p](%F:%L) %m%n
######################################################################################
# DailyRolling File \u6bcf\u5929\u4ea7\u751f\u4e00\u4e2a\u65e5\u5fd7\u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u683c\u5f0f:log2009-09-11
######################################################################################
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.DatePattern=yyyy-MM-dd
log4j.appender.file.File=${SMBMS_C12_10.root}/logs/log.log
log4j.appender.file.Append=true
log4j.appender.file.Threshold=debug
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern= - (%r ms) - %d{yyyy-M-d HH:mm:ss}%x[%5p](%F:%L) %m%n
#DWR \u65e5\u5fd7
#log4j.logger.org.directwebremoting = ERROR
#\u663e\u793aHibernate\u5360\u4f4d\u7b26\u7ed1\u5b9a\u503c\u53ca\u8fd4\u56de\u503c
#log4j.logger.org.hibernate.type=DEBUG,CONSOLE
#log4j.logger.org.springframework.transaction=DEBUG
#log4j.logger.org.hibernate=DEBUG
#log4j.logger.org.acegisecurity=DEBUG
#log4j.logger.org.apache.myfaces=TRACE
#log4j.logger.org.quartz=DEBUG
#log4j.logger.com.opensymphony=INFO
#log4j.logger.org.apache.struts2=DEBUG
log4j.logger.com.opensymphony.xwork2=debug
此日志文件可以在很多场合使用,所以复用性很强
第三步:编写实体类
例如这样的实体类
public class Employee {
//定义empName属性,它的值将通过Spring框架进行设置
private String empName;
private String sayWords;
//无参构造器
public Employee() {
}
//有参构造器
public Employee(String empName,String sayWords) {
this.empName = empName;
this.sayWords=sayWords;
}
//获得 empName
public String getEmpName() {
return empName;
}
//设置 empName
public void setEmpName(String empName) {
this.empName = empName == null ? null : empName.trim();
}
//获得 sayWords
public String getSayWords() {
return sayWords;
}
//设置 sayWords
public void setSayWords(String sayWords) {
this.sayWords= sayWords== null ? null : sayWords.trim();
}
//定义打印方法,输出一句完整的问候
public void print(){
System.out.println(this.getEmpName()+"说:"+this.getSayWords());
}
}
第四步:配置Spring (使用IDEA)
一般为了便于管理,在项目中会创建专门的Source Folder,如resources目录,并专门存放框架的配置文件
记得要右键--->Mark Directory as--->Resources Boot才能使这个目录作为资源包被项目读取到
配置如下
<?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-3.2.xsd">
<!--通过bean标签(元素)声明spring创建的实例,该实例的类型是通过class
属性指定的,并通过id属性为实例指定一个名称,便于访问-->
<!--通过bean标签(元素)声明spring创建的实例,该实例的类型是通过class
属性指定的,并通过id属性为实例指定一个名称,便于访问-->
<bean id="helloSpring" class="day01.pojo.Employee ">
<!--property属性用来为实例的属性赋值,其实此处调用的事setEmpName()来实现赋值的-->
<!--name属性是即将要复制的属性名-->
<property name="empName">
<!--此处将spring的值赋给了who-->
<value>张嘎</value>
</property>
<property name="sayWords">
<value>三天不打小鬼子,手都痒痒</value>
</property>
</bean>
<bean id="helloSpring1" class="day01.pojo.Employee">
<property name="who">
<value>Rod</value>
</property>
<property name="sayWords">
<value>世界上有两种人,222222和33333333</value>
</property>
</bean>
</beans>
分析:此处注册了两个Bean(对象),分别是等效于
Employee helloSpring=new Employee ("张嘎","三天不打小鬼子,手都痒痒")
Employee helloSpring1=new Employee ("Rod","世界上有两种人,222222和33333333")
的效果
第五步:测试
import day01.pojo.Employee ;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSpring {
@Test
public void testSpring(){
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
HelloSpring helloSpring = (Employee )ac.getBean("helloSpring");
HelloSpring helloSpring1 = (Employee )ac.getBean("helloSpring1");
helloSpring.print();
helloSpring1.print();
}
}
补充:没有导入测试junit4的jar包的话可能没法这样写,那就用main方法也是一样的
测试结果:
张嘎说: 三天不打小鬼子,手都痒痒
Rod说: 世界上有两种人,22222233333333
第六步:总结
这行代码是最重要的:
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
他创建了一个工具接口对象,这个对象能调用getBean(bean的id)方法来获取配置中建好的对象;
官方解释:
ApplicationContext 是一个接口,负责读取Spring配置文件,管理对象的加载,生成,维护Bean对象与Bean对象之间的依赖关系,负责Bean的生命周期等
ClassPathXmlApplicationContext是ApplicationContext接口 的实现类.
除了ApplicationContext 及其实现类,还可以通过BeanFactory接口及其实现类对Bean组件实施管理.事实上,ApplicationContext 就是建立在BeanFactory的基础之上,BeanFactory 是SpingIoC容器的核心,负责管理组件和它们之间的依赖关系,应用程序通过BeanFactory接口 与 SpingIoC容器交互
ApplicationContext 是 BeanFactory的子接口
其他例子:打印机程序(黑白墨盒,彩色墨盒,A4B5纸)是经典例子,可用来练手SpringIoC