Spring 实现 IoC
(2)为该项目添加 log4j.properties 文件,用来控制日志输出。log4j.properties 文件内容如下:
# rootLogger是所有日志的根日志,修改该日志属性将对所有日志起作用
# 下面的属性配置中,所有日志的输出级别是info,输出源是con
log4j.rootLogger=info,con
# 定义输出源的输出位置是控制台
log4j.appender.con=org.apache.log4j.ConsoleAppender
# 定义输出日志的布局采用的类
log4j.appender.con.layout=org.apache.log4j.PatternLayout
# 定义日志输出布局
log4j.appender.con.layout.ConversionPattern=%d{MM-dd HH:mm:ss}[%p]%c%n -%m%n
package cn.springdemo; /**
* 第一个Spring,输出"Hello,Spring!"。
*/
public class HelloSpring {
// 定义who属性,该属性的值将通过Spring框架进行设置
private String who = null; /**
* 定义打印方法,输出一句完整的问候。
*/
public void print() {
System.out.println("Hello," + this.getWho() + "!");
} /**
* 获得 who。
*
* @return who
*/
public String getWho() {
return who;
} /**
* 设置 who。
*
* @param who
*/
public void setWho(String who) {
this.who = who;
} }
(4)编写 Spring 配置文件,在项目的 classpath 根路径下创建 applicationContext.xml 文件(为便于管理框架的配置文件,可在项目中创建专门的 Source folder 源文件夹,如 resources 目录,并将 Spring 配置文件创建在其根路径下)。在 Spring 配置文件中创建 HelloSpring 类的实例并为 who 属性注入属性值。
<?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 id="helloSpring" class="cn.springdemo.HelloSpring">
<!-- property元素用来为实例的属性赋值,此处实际是调用setWho()方法实现赋值操作 -->
<property name="who">
<!-- 此处将字符串"Spring"赋值给who属性 -->
<value>Spring</value>
</property>
</bean> </beans>
说明:
1、在 Spring 配置文件中,使用 <bean> 元素来定义 Bean(也可称为组件)的实例。这个元素有两个常用属性:一个是 id,表示定义的 Bean 实例的名称,另一个是 class,表示定义的 Bean 实例的类型。
2、使用 <bean> 元素定义一个组件时,通常需要使用 id 属性为其指定一个用来访问的一的名称。如果想为 Bean 指定更多的别名,可以通过 name 属性指定,名称之间使用逗号、分号或空格进行分隔。
3、在本例中,Spring 为 Bean 的属性赋值是通过调用属性的 setter 方法实现的,这种做法称为 “设值注入”,而非直接为属性赋值。若属性名为 who,但是 setter 方法名为 setSomebody(),Spring 配置文件中应写成 name="somebody" 而非name="who"。所以在为属性和 setter 访问器命名时,一定要注意遵循 JavaBean 的命名规范。
(5)使用 Junit 进行单元测试
package test; import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.springdemo.HelloSpring; public class HelloSpringTest { @Test
public void helloSpring() {
// 通过ClassPathXmlApplicationContext实例化Spring的上下文
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// 通过ApplicationContext的getBean()方法,根据id来获取bean的实例
HelloSpring helloSpring = (HelloSpring) context.getBean("helloSpring");
// 执行print()方法
helloSpring.print();
} }
说明:
1、通过 “Hello,Spring!" 的例子,我们发现 Spring 会自动接管配置文件中 Bean 的创建和为属性赋值的工作。 Spring 在创建 Bean 的实例后,会调用相应的 setter 方法为实例设置属性值。实例的属性值将不再由程序中的代码来主动创建和管理,改为被动接受 Spring 的注入,使得组件之间以配置文件而不是硬编码的方式组织在一起。
2、相对于 “控制反转” ,“依赖注入” 的说法也许更容易理解一些,即由容器(如 Spring)负责把组件所 “依赖” 的具体对象 “注入” (赋值) 给组件,从而避免组件之间以硬编码的方式耦合在一起。
3、ApplicationContext 是一个接口,负责读取 Spring 配置文件,管理对象的加载、生成,维护 Bean 对象与 Bean 对象之间的依赖关系,负责 Bean 的生命周期等。ClassPathXmlApplicationContext 是 ApplicationContext 接口的实现类,用于从 classpath 路径中读取 Spring 配置文件。
4、除了 ClassPathXmlApplicationContext,ApplicationContext 接口还有其他实现类。例如,FileSystemXmlApplicationContext 也可以用于加载 Spring 配置文件。
5、除了 ApplicationContext 及其实现类,还可以通过 BeanFactory 接口及其实现类对 Bean 组件实施管理。事实上,ApplicationContext 就是建立在 BeanFactory 的基础之上,BeanFactory 是 Spring IoC 容器的核心,负责管理组件和它们之间的依赖关系,应用程序通过 BeanFactory 接口与 Spring IoC 容器交互。 ApplicationContext 是 BeanFactory 的子接口,可以对企业级开发提供更全面的支持。
字段一般用来承载数据,所以为了安全性,一般定义为私有的。字段和常量描述了类的数据(域),当这些数据的某些部分不允许外界访问时,根据 “对象封装” 的原则,应尽量避免将一个类型的字段以公有方式提供给外部。除了 final 修饰的常量。一般将其设置为 private 类型。既然是私有,那外界怎么访问呢? 当然是通过 Java 的属性方法。
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
1、这个类必须具有一个公共的(public)无参构造函数;
2、所有属性私有化(private);
3、私有化的属性必须通过 public 类型的方法(getter和setter)暴露给其他程序,并且方法的命名也必须遵循一定的命名规范。
4、这个类应是可序列化的。(比如可以实现Serializable 接口,用于实现bean的持久性)
4、对于JavaBean,就是一个Java模型组件,他为使用Java类提供了一种标准的格式,在用户程序和可视化管理工具中可以自动获得这种具有标准格式的类的信息,并能够创建和管理这些类。
5、JavaBean可以使应用程序更加面向对象,可以把数据封装起来,把应用的业务逻辑和显示逻辑分离开,降低了开发的复杂程度和维护成本!
6、JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBeans 通过提供符合一致性设计模式的公共方法将内部域暴露称为属性。众所周知,属性名称符合这种模式,其他Java 类可以通过内省机制发现和操作这些JavaBean 属性。
1、src 不是 classpath,WEB-INF/classes、lib 才是 classpath,WEB-INF/ 是资源目录,客户端不能直接访问。WEB-INF/classes 目录存放 src 目录 Java 文件编译之后的 class文件,xml、properties 等资源配置文件,这是一个定位资源的入口。
Spring 实现 IoC的更多相关文章
- Spring的IOC和AOP之深剖
今天,既然讲到了Spring 的IOC和AOP,我们就必须要知道 Spring主要是两件事: 1.开发Bean:2.配置Bean.对于Spring框架来说,它要做的,就是根据配置文件来创建bean实例 ...
- Spring框架IOC容器和AOP解析
主要分析点: 一.Spring开源框架的简介 二.Spring下IOC容器和DI(依赖注入Dependency injection) 三.Spring下面向切面编程(AOP)和事务管理配置 一.S ...
- Spring总结—— IOC 和 Bean 的总结
一.Spring 官方文档中给出的 Spring 的整体结构. 二.我自己所理解的 Spring 整体结构图. 三.本次总结 Spring 核心部分 1.从上面图中可以看出,Beans 和 Conte ...
- spring的IOC和AOP
spring的IOC和AOP 1.解释spring的ioc? 几种注入依赖的方式?spring的优点? IOC你就认为他是一个生产和管理bean的容器就行了,原来需要在调用类中new的东西,现在都是 ...
- spring容器IOC创建对象<二>
问题?spring是如何创建对象的?什么时候创建对象?有几种创建方式?测试对象是单例的还是多例的 ?对象的初始化和销毁? 下面的四大模块IOC的内容了!需要深刻理解 SpringIOC定义:把对象的创 ...
- Spring中IoC的入门实例
Spring中IoC的入门实例 Spring的模块化是很强的,各个功能模块都是独立的,我们可以选择的使用.这一章先从Spring的IoC开始.所谓IoC就是一个用XML来定义生成对象的模式,我们看看如 ...
- Spring中IOC和AOP的详细解释
我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式. IOC就是典型的工厂模式,通过s ...
- Spring的IoC应用
IoC(Inversion of Control,控制反转) Spring的IoC应用是其框架的最大的特点,通过依赖注入可以大大降低代码之间的耦合度,从而实现代码和功能之间的分离.在代码中可以不直接和 ...
- Spring 实践 -IoC
Spring 实践 标签: Java与设计模式 Spring简介 Spring是分层的JavaSE/EE Full-Stack轻量级开源框架.以IoC(Inverse of Control 控制反转) ...
- 挖坟之Spring.NET IOC容器初始化
因查找ht项目中一个久未解决spring内部异常,翻了一段时间源码.以此文总结springIOC,容器初始化过程. 语言背景是C#.网上有一些基于java的spring源码分析文档,大而乱,乱而不全, ...
随机推荐
- SSM整合(一)
http://www.cnblogs.com/xuerong/p/6796600.html 技术点 1.基础框架-ssm (SpringMVC +Spring +MyBatis) 2.数据库MySqQ ...
- null、undefined和NaN的简洁比较
Null 类型也只有一个值,即null.null用来表示尚未存在的对象,常用来表示函数企图返回一个不存在的对象.Undefined 类型只有一个值,即undefined.当声明的变量还未被初始化时,变 ...
- bzoj 1606: [Usaco2008 Dec]Hay For Sale 购买干草【01背包】
在洛谷上被卡常了一个点! 就是裸的01背包咯 为啥我在刷水题啊 #include<iostream> #include<cstdio> #include<algorith ...
- bzoj 3218: a + b Problem【主席树+最小割】
直接建图比较显然,是(s,i,w),(i,t,b),(i,i',p),(i,j,inf),然而建出来之后发现边数是n方级别的,显然跑不过去,然后就有一种比较神的思路:把a离散了建一棵权值线段树,然后要 ...
- 深入浅出索引--Mysql45讲笔记记录 打卡day3
看了极客时间的mysql45讲记录一下自己理解的关于索引部分 为什么会有索引呢? 答:索引就像书的目录一样,可以让你快速知道你要看的部分在多少页.换句话说,索引就是为了提高数据库的查询效率. 索引的数 ...
- 莫比乌斯反演总结——Chemist
懵逼乌斯反演果然名不虚传,自闭了两天的我打算学习一下这一块比较实用的数论内容. (注:1.为了区分狄尼克雷卷积与乘法,本篇文章中乘号全部省略,卷积全部用" * "表示.2.用gcd ...
- PostgreSQL 9.6.2版本在centOS下的安装和配置
1.如果有用yum安装过旧版,卸载掉: yum remove postgresql* 2.更新一下yum: sudo yum update 3.去 官网 找到 适合你系统 的资源的下载地址,然后使用w ...
- [AHOI2007]密码箱
Description 在一次偶然的情况下,小可可得到了一个密码箱,听说里面藏着一份古代流传下来的藏宝图,只要能破解密码就能打开箱子,而箱子背面刻着的古代图标,就是对密码的提示.经过艰苦的破译,小可可 ...
- _bzoj1007 [HNOI2008]水平可见直线【单调栈】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1007 按斜率排序,去掉斜率相同时,截距较小的直线(即只保留该斜率下截距最大的直线).若当前直 ...
- 贪心 UVALive 6834 Shopping
题目传送门 /* 题意:有n个商店排成一条直线,有一些商店有先后顺序,问从0出发走到n+1最少的步数 贪心:对于区间被覆盖的点只进行一次计算,还有那些要往回走的区间步数*2,再加上原来最少要走n+1步 ...