Spring学习笔记(一)

一、Spring 框架

Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。

Spring框架由七个模块组成:核心容器、应用上下文(Context)模块、Spring的AOP模块、JDBC抽象和DAO模块、对象/关系映射集成模块、Spring的Web模块、Spring的MVC框架。

介绍传送门-->http://baike.baidu.com/link?url=ZMgPopo8CSuxoq4cxxCjy600WLc07HP9K4ej4wI4Z07jpfyt82RlOk1MimelYU_tZwn9OyLE_dQVlXNzDm_Fba

二、关于学习Spring框架之前自身的疑惑

1 Spring框架是如何对项目进行有效管理的?

三、学习开始

3.1 准备好Spring的说明书   http://docs.spring.io/spring/docs/

3.2 准备Spring的JAR包 spring-framework-3.0.0.RELEASE

3.3 先写一点测试代码(不使用Spring框架),然后再引入Spring框架进行管理,对比前后者代码的不同之处

测试代码逻辑:

1 UserServiceImpl调用 UserDao(接口) 完成对User对象的保存和更新

2 UserDao(接口) 有两种实现UserDaoImpl和UserDaoImpl2 

UserServiceImpl

 package com.serviceImpl;

 import com.dao.UserDao;
import com.daoImpl.UserDaoImpl;
import com.entity.User; public class UserServiceImpl {
private UserDao userDao; public void add(User user) {
userDao = new UserDaoImpl(); //UserDaoImpl实现接口
userDao.save(user);
} public void modify(User user) {
userDao = new UserDaoImpl();//UserDaoImpl实现接口
userDao.update(user);
} public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}

UserDao(接口)

package com.dao;

import com.entity.User;

public interface UserDao {
public void save(User user);
public void update(User user);
}

UserDao的实现类UserDaoImp

 package com.daoImpl;

 import com.dao.UserDao;
import com.entity.User; public class UserDaoImpl implements UserDao{ public void save(User user) {
System.out.println(user.getName()+"-->"+user.getRemark()+" save --调用UserDaoImpl!");
} public void update(User user) {
System.out.println(user.getName()+"-->"+user.getRemark()+" update --调用UserDaoImpl!");
}
}

UserDao的另一个实现类UserDaoImpl2

package com.daoImpl;

import com.dao.UserDao;
import com.entity.User; public class UserDaoImpl2 implements UserDao{ public void save(User user) {
System.out.println(user.getName()+"-->"+user.getRemark()+" save --调用UserDaoImpl2!");
} public void update(User user) {
System.out.println(user.getName()+"-->"+user.getRemark()+" update --调用UserDaoImpl2!");
}
}

最后给一个测试类(方便使用)

package com.serviceImpl.test;

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test; import com.entity.User;
import com.serviceImpl.UserServiceImpl; public class UserServiceImplTest {
User user; @Before
public void setUp() throws Exception {
user = new User();
user.setName("testName");
user.setRemark("testRemark");
} @Test
public void testAdd() {
UserServiceImpl userServiceImpl = new UserServiceImpl();
userServiceImpl.add(user);
} @Test
public void testModify() {
UserServiceImpl userServiceImpl = new UserServiceImpl();
userServiceImpl.modify(user);
}
}

测试代码完成(未使用Spring框架)。

执行结果:

testName-->testRemark save --调用UserDaoImpl!
testName-->testRemark update --调用UserDaoImpl!

以上代码及执行结果可以看出

1 UserDao接口的实现方式是通过UserServiceImpl类里的代码管理的。

2 如果我们需要改变UserDao接口的实现方式则需要改动UserServiceImpl的代码 例如

userDao = new UserDaoImpl(); ----> userDao = new UserDaoImpl2(); //UserDaoImpl改成UserDaoImpl2

3.4 使用Spring框架进行管理

1 导入spring JAR包

2 在src目录下创建Beans.xml,剪切spring说明书中的basic structure of XML-based configuration metadata代码,粘贴进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"> <bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean> <bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean> <!-- more bean definitions go here --> </beans>

3 对应于我们的项目开始进行Beans.xml的详细配置(目前写的Beans.xml 里对接口的注入是通过set方法,是Spring 注入的一种,随后会详细介绍)

<?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框架beans.xml配置文件的基础:一个bean和一个对应的类,然后对bean进行统一的管理 --> <!--userDao的第一种实现方法映射的 bean -> userDaoImpl-->
<bean id="userDaoImpl" class="com.daoImpl.UserDaoImpl">
</bean> <!--userDao的第二种实现方法映射的 bean -> userDaoImpl2-->
<bean id="userDaoImpl2" class="com.daoImpl.UserDaoImpl2">
</bean> <!--UserServiceImpl映射的 bean -> userServiceImpl-->
<!--在这个bean里 我们来配置userDao的实现类对应的bean,引入property标签。
1 name对应当前bean(类)里面的变量名 private UserDao userDao;
2 ref表示所关联是哪个bean。 这里我们关联上userDaoImpl2也就是第二种实现方式 class="com.daoImpl.UserDaoImpl2";
3 完成1,2后,我们可以去把com.serviceImpl.UserServiceImpl文件里,原本在代码里NEW 出实现类的那段话给去掉,spring已经开始进行管理了。
-->
<bean id="userServiceImpl" class="com.serviceImpl.UserServiceImpl">
<property name="userDao" ref="userDaoImpl"> </property>
</bean>
</beans>

4 删除UserServiceImpl类里对接口实现方式控制的代码

package com.serviceImpl;

import com.dao.UserDao;
import com.daoImpl.UserDaoImpl;
import com.entity.User; public class UserServiceImpl {
private UserDao userDao; public void add(User user) {
// userDao = new UserDaoImpl(); //已经不需要我们在程序里面再NEW实现类了
userDao.save(user);
} public void modify(User user) {
// userDao = new UserDaoImpl();//已经不需要我们在程序里面再NEW实现类了
userDao.update(user);
} public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}

5 已经完成了Spring的配置,现在对测试文件UserServiceImplTest进行修改,执行查看效果

package com.serviceImpl.test;

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.entity.User;
import com.serviceImpl.UserServiceImpl; public class UserServiceImplTest {
User user; @Before
public void setUp() throws Exception {
user = new User();
user.setName("testName");
user.setRemark("testRemark");
} @Test
public void testAdd() {
ApplicationContext app = new ClassPathXmlApplicationContext("beans.xml");//通过ClassPathXmlApplicationContext获取beans.xml信息-->app
UserServiceImpl UserServiceImpl = (UserServiceImpl)app.getBean("userServiceImpl");//通过app NEW出具体bean对应的类,注意需要转换类型
UserServiceImpl.add(user);//调用方法
} @Test
public void testModify() {
ApplicationContext app = new ClassPathXmlApplicationContext("beans.xml");
UserServiceImpl UserServiceImpl = (UserServiceImpl)app.getBean("userServiceImpl");
UserServiceImpl.modify(user);
}
}

6 执行结果(UserDao接口的实现为bean里配置的userDaoImpl)

testName-->testRemark  save --调用UserDaoImpl2!

testName-->testRemark  update  --调用UserDaoImpl2!

7 如果要更换UserDao的实现,有了spring进行管理,我们只要去对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"> <bean id="userDaoImpl" class="com.daoImpl.UserDaoImpl">
</bean> <bean id="userDaoImpl2" class="com.daoImpl.UserDaoImpl2">
</bean> <bean id="userServiceImpl" class="com.serviceImpl.UserServiceImpl">
<property name="userDao" ref="userDaoImpl"> </property> <!-- 修改 ref="userDaoImpl"-->
</bean>
</beans>

8 再次查看执行的结果(UserDao接口的实现已经更换成userDaoImpl)

testName-->testRemark  save --调用UserDaoImpl!

testName-->testRemark  update --调用UserDaoImpl!

9 到此,Spring的部署及简单应用已经完成。

总结一下

1 Spring 是通过配置beans.xml 来对类和接口进行管理

2 具体的操作:

一 配置beans.xml  并删除代码里原本用来管理接口实现的代码

二 改写调用的方法 ClassPathXmlApplicationContext("xmlProfile").getBean("beanName");

3 对比原先的测试代码与用了Spring管理的后测试代码

一 程序的扩展性变强,只需要通过配置文件便可以进行管理,例如修改接口的实现方式变得非常简单。

二 程序的可阅读性提高,不需要进入代码层面进行阅读接口实现的方式,只需要在配置文件中查看即可。

Spring框架配置beans.xml的更多相关文章

  1. Spring框架配置beans.xml扩展

    Spring学习笔记(二) 续Spring 学习笔记(一)之后,对Spring框架XML的操作进行整理 1 什么是IOC(DI) IOC = inversion of control   控制反转 D ...

  2. spring框架中beans.xml文件报错XmlBeanDefinitionStoreException

    第一次构建spring,实现简单的注入方式,就发生了beans.xml文件报错,报错信息如下图 org.springframework.beans.factory.xml.XmlBeanDefinit ...

  3. Spring 框架配置web.xml 整合web struts

    package cn.itcast.e_web; import java.io.IOException; import javax.servlet.ServletContext; import jav ...

  4. Spring框架之beans源码完全解析

    导读:Spring可以说是Java企业开发里最重要的技术.而Spring两大核心IOC(Inversion of Control控制反转)和AOP(Aspect Oriented Programmin ...

  5. Spring注解配置和xml配置优缺点比较

    Spring注解配置和xml配置优缺点比较 编辑 ​ 在昨天发布的文章<spring boot基于注解方式配置datasource>一文中凯哥简单的对xml配置和注解配置进行了比较.然后朋 ...

  6. 使用spring框架,用xml方式进行bean装配出现“The fully qualified name of the bean's class, except if it serves...”

    使用spring框架,用xml方式进行bean装配出现“The fully qualified name of the bean's class, except if it serves...”. 原 ...

  7. 最新 Eclipse IDE下的Spring框架配置及简单实例

    前段时间开始着手学习Spring框架,又是买书又是看视频找教程的,可是鲜有介绍如何配置Spring+Eclipse的方法,现在将我的成功经验分享给大家. 本文的一些源代码来源于码农教程:http:// ...

  8. 0044 spring框架的applicationContext.xml的命名空间

    Spring框架中,创建bean,装配bean,事务控制等,可以用xml配置或者注解扫描的方法实现.如果用注解扫描,在xml配置中得加上 <context:component-scan base ...

  9. 【Spring】Spring框架配置详情

    Spring框架的一个亮点就是能实现注入并且可以对实例化的Bean进行管理. 本文将对Spring框架的配置做一个详细的讲解. 一般情况下Spring是不单独使用的,而是和Hibernate配合使用, ...

随机推荐

  1. [转贴] 2016一月12日起.NET 4, 4.5 and 4.5.1 停止安全更新、技术支持 or hotfix

    [转贴] 2016一月12日起.NET 4, 4.5 and 4.5.1 停止安全更新.技术支持 or hotfix https://www.dotblogs.com.tw/mis2000lab/20 ...

  2. Unity结合Flask实现排行榜功能

    业余做的小游戏,排行榜本来是用PlayerPrefs存储在本地,现在想将数据放在服务器上.因为功能很简单,就选择了小巧玲珑的Flask来实现. 闲话少叙.首先考虑URL的设计.排行榜无非是一堆分数sc ...

  3. Java 使用正则表达式取出图片地址以及跳转的链接地址,来判断死链(一)

    任务:通过driver的getPageSource()获取网页的源码内容,在把网页中图片链接地址和跳转的url地址进行过滤,在get每个请求,来判断是否是死链 如图: 获取网页源码中所有的href,以 ...

  4. Angular4中常用管道

    通常我们需要使用管道实现对数据的格式化,Angular4中的管道和之前有了一些变化,下面说一些常用的管道. 一.大小写转换管道 uppercase将字符串转换为大写 lowercase将字符串转换为小 ...

  5. Spring+ ApplicationListener

    有时候 需要在容器初始化完成后,加载些 代码字典或不常变的信息  放入缓存之类的,这里使用spring 初始化bean,并实例化 1.创建一个ApplicationListener类 import o ...

  6. Android_组件_Activity基础

    一.概述 Activity是应用组件,提供了用户交互的窗口.一个应用由多个彼此联系的Activity组成.它大多数情况是全屏窗口显示,也可以作为悬浮窗口 或者 多窗口模式. 二.生命周期 下图是来自A ...

  7. 科学计算库Numpy——运算

    np.multiply(array1,array2) 该函数用于数组中对应位置上的数相乘. 一维向量 二维数组 np.dot(array1,array2) 两个数组都是一维向量 数组中对应位置上的数相 ...

  8. 【104】Maven3.5.0结合eclipse使用,提示Lambda expressions are allowed only at source level 1.8 or above错误的解决方法

    错误重现 我的机器上安装了 maven 3.5.0,在 eclipse 中创建 maven 项目.pom.xml配置如下: <project xmlns="http://maven.a ...

  9. Python装饰器使用规范案例详解

    由于函数也是一个对象,而且函数对象可以被赋值给变量,所以,通过变量也能调用该函数. >>> def now(): ... print('2015-3-25') ... >> ...

  10. A * B Problem Plus HDU - 1402 (FFT)

    A * B Problem Plus HDU - 1402 (FFT) Calculate A * B.  InputEach line will contain two integers A and ...