Spring IOC笔记

作为一名小白,在最近刚刚学习了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>世界上有两种人,22222233333333</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

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值