一、 spring概述

Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如图 1 所示。

 1. Spring 框架的 7 个模块 

组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

核心容器

核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。

Spring 上下文

Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。

Spring AOP

通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。

Spring DAO

JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。

Spring ORM

Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。

Spring Web 模块

Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。

Spring MVC 框架

MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

二、实例化spring容器

2.1新建一个web项目spring-demo

2.2,导入spring核心包

2.3,将applicationContext.xml文件导入src下,新建一个包com.spring.demo

2.4,导入JUnit,项目右键点击properties---->java build path---->Libraries----->add library----->Junit4--->next--->finish

2.5,新建一个Junit Test Case类,

2.6,实例化容器,获取applicationContext配置文件地址,创建ApplicationContext对象传入获取的配置地址,控制台打印出实例化容器信息

2.7,控制台打印出信息下面信息说明容器实例化成功

org.springframework.context.support.ClassPathXmlApplicationContext@3c1d332b: startup date [Wed Nov 09 16:23:19 CST 2016]; root of context hierarchy

三、利用Spring容器创建javaBean对象

1,用构造器实例化

<beanid="calendarObj1"class="java.util.GregorianCalendar"></bean>

1.2)TestCase调用getBean获取配置文件bean,创建bean对象实例

Calendar cr = ac.getBean("calendarObj1",Calendar.class);

看控制台信息实例化成功

calendarObj1:java.util.GregorianCalendar[time=1478679801551,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2016,MONTH=10,WEEK_OF_YEAR=46,WEEK_OF_MONTH=2,DAY_OF_MONTH=9,DAY_OF_YEAR=314,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=4,HOUR_OF_DAY=16,MINUTE=23,SECOND=21,MILLISECOND=551,ZONE_OFFSET=28800000,DST_OFFSET=0]

2,使用静态工厂方法实例化

2.1) 在配置文件添加<bean id="calendarObj2" class="java.util.GregorianCalendar" factory-method="getInstance"></bean>

2.2) TestCase测试类test方法中添加

Calendar cr2 = ac.getBean("calendarObj2",Calendar.class);

       System.out.println("calendarObj2:"+cr2);

2.3看控制台

calendarObj2:java.util.GregorianCalendar[time=1478679801586,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2016,MONTH=10,WEEK_OF_YEAR=46,WEEK_OF_MONTH=2,DAY_OF_MONTH=9,DAY_OF_YEAR=314,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=4,HOUR_OF_DAY=16,MINUTE=23,SECOND=21,MILLISECOND=586,ZONE_OFFSET=28800000,DST_OFFSET=0]

实例化成功

3,实例工厂实例化

3.1)在applicationContext.xml配置文件中添加

<!-- 实例工厂实例化 -->
<bean id="calendarObj3" class="java.util.GregorianCalendar"></bean>
<bean id="dateObj" factory-bean="calendarObj3" factory-method="getTime"></bean>

3.2)在测试类test方法增加

Date date = ac.getBean("dateObj",Date.class);

    System.out.println("calendarObj3:"+date);

3.3 junit测试,控制输出

calendarObj3:Wed Nov 09 16:23:21 CST 2016

实例化成功

四,容器的IOC应用

4.1)Set注入

通过调用无參构造器或者无参静态工厂方法实例化bean之后调用该bean的set方法,即可实现set方式注入

4.1.1)在配置文件添加

<!-- 数据源setter注入 -->
<bean id="dataSource" class="com.spring.dao.JDBCDataSource">
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8"></property>
<property name="username" value="root"></property>
<property name="password" value="">123456</property>
</bean>

4.1.2)写JDBCDataSource类,这个类封装了管理数据库连接的方法getConnection(),在这个方法执行前需要数据库连接参数:数据库驱动,连接URL,用户名和密码,下面是JDBCDataSource代码

package com.spring.dao;

import java.io.Serializable;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException; public class JDBCDataSource implements Serializable{
private static final long serialVersionUID = 1L;
private String driver;
private String url;
private String username;
private String password;
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
try{
Class.forName(driver);
this.driver = driver;
}catch(Exception e){
throw new RuntimeException(e);
}
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public static long getSerialversionuid() {
return serialVersionUID;
}
public Connection getConnection() throws SQLException{
Connection cn = DriverManager.getConnection(url,username,password);
return cn;
}
public void close(Connection cn){
if(cn!=null){
try{
cn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
}

4.1.3)利用spring实现JDBCDataSource对象的创建,再使用set注入方式将数据库参数注入给JDBCDataSource,这样就可以正常的调用getConnection()方法获得数据库连接了。

4.1.4)TestCase测试连接方法

@Test
public void testJDBCDataSource() throws SQLException{
String conf = "applicationContext.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(conf);
JDBCDataSource jds = ac.getBean("dataSource",JDBCDataSource.class);
Connection cn = jds.getConnection();
System.out.println(cn);
}

4.1.5)控制台输出

com.mysql.jdbc.JDBC4Connection@1a7244ca

说明已经获得数据库连接了

4.2)利用构造器参数实现依赖属性的注入

4.2.1)先建一个user表

CREATE TABLE `user` (
`id` int(18) NOT NULL AUTO_INCREMENT,
`name` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
`phone` varchar(20) DEFAULT NULL,
`password` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
`gender` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

4.2.2)创建user实体类

package com.spring.entity;

public class User {
private String id;
private String name;
private String phone;
private String password;
private String gender; public User(String id, String name, String phone, String password,
String gender) {
super();
this.id = id;
this.name = name;
this.phone = phone;
this.password = password;
this.gender = gender;
}
public User() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", phone=" + phone
+ ", password=" + password + ", gender=" + gender + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((gender == null) ? 0 : gender.hashCode());
result = prime * result + ((id == null) ? 0 : id.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result
+ ((password == null) ? 0 : password.hashCode());
result = prime * result + ((phone == null) ? 0 : phone.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (gender == null) {
if (other.gender != null)
return false;
} else if (!gender.equals(other.gender))
return false;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
if (password == null) {
if (other.password != null)
return false;
} else if (!password.equals(other.password))
return false;
if (phone == null) {
if (other.phone != null)
return false;
} else if (!phone.equals(other.phone))
return false;
return true;
} }

4.2.3)创建接口UserDao,写一个通过用户名查询用户的方法findUserByName(String name)

package com.spring.dao;

import com.spring.entity.User;

public interface UserDao {
public User findUserByName(String name);
}

4.2.4)创建MySqlUserDao实现UserDao,

package com.spring.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import com.spring.entity.User; public class MysqlUserDao implements UserDao{ private JDBCDataSource dataSource; public JDBCDataSource getDataSource() {
return dataSource;
}
public void setDataSource(JDBCDataSource dataSource) {
this.dataSource = dataSource;
} public MysqlUserDao(JDBCDataSource dataSource) {
super();
this.dataSource = dataSource;
}
@Override
public User findUserByName(String name) {
// TODO Auto-generated method stub
System.out.println("-----------查询用户信息-------------");
String sql = "select * from user where name = ?";
Connection con = null;
try{
String url = dataSource.getUrl();
System.out.println(url);
con = dataSource.getConnection();
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, name);
ResultSet rs = ps.executeQuery();
User user = null;
while(rs.next()){
user = new User();
user.setId(rs.getString("id"));
user.setName(rs.getString("name"));
user.setGender(rs.getString("gender"));
user.setPassword(rs.getString("password"));
user.setPhone(rs.getString("phone"));
}
rs.close();
ps.close();
return user;
}catch(Exception e){
e.printStackTrace();
throw new RuntimeException(e);
}finally{
dataSource.close(con);
}
} }

4.2.5)Spring支持利用构造器注入参数实例化bean方式,只要在配置文件增加构造器参数constructor-arg,Spring就会自动的调用有参的构造器创建bean对象实例。

<bean id="userDao" class="com.spring.dao.MysqlUserDao">
<constructor-arg index="0" ref="dataSource"></constructor-arg>
</bean>

4.2.6)在测试类写个testFindUserByName方法

@Test
public void testFindUserByName(){
String con = "applicationContext.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(con);
UserDao userDao = ac.getBean("userDao",UserDao.class);
User user = userDao.findUserByName("lisi");
System.out.println(user); }

4.2.7)控制台正确输出用户信息说明构造器注入成功

User [id=2, name=lisi, phone=110, password=321654, gender=1]

4.2.8)失败可能没在mysqluserdao增加有参构造器

4.3.利用自动装配实现自动属性注入

4.3.1)创建一个UserLoginService类,写一个登录方法login(),该方法依赖finfUserByName()方法

package com.spring.service;

import com.spring.dao.UserDao;
import com.spring.entity.User; public class UserLoginService {
private UserDao userDao; public UserDao getUserDao() {
return userDao;
} public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public User login(String name,String password){
try{
User user = userDao.findUserByName(name);
if(user.getPassword().equals(password)){
return user;
}
return null;
}catch(Exception e){
e.printStackTrace();
return null; } }
}

4.3.2)autowire属性有四种方式默认是no,(1).byName(2)byType,(3)constuctor,(4)autodetect,

4.3.3)修改配置文件,添加配置

<!-- 自动装配 -->
<bean id="userLoginService" class="com.spring.service.UserLoginService" autowire="byName"></bean>

4.3.4)写测试方法testUserLogin()

@Test
public void testUserLogin(){
String con = "applicationContext.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(con);
UserLoginService us = ac.getBean("userLoginService",UserLoginService.class);
User user = us.login("lisi", "321654");
System.out.println(user);
}

4.3.5)控制台输出

User [id=2, name=lisi, phone=110, password=321654, gender=1]

自动装配说明成功

附上代码地址:https://github.com/anonymou-L/demo

Spring框架学习(一)的更多相关文章

  1. Spring框架学习一

    Spring框架学习,转自http://blog.csdn.net/lishuangzhe7047/article/details/20740209 Spring框架学习(一) 1.什么是Spring ...

  2. spring框架学习(三)junit单元测试

    spring框架学习(三)junit单元测试 单元测试不是头一次听说了,但只是听说从来没有用过.一个模块怎么测试呢,是不是得专门为一单元写一个测试程序,然后将测试单元代码拿过来测试? 我是这么想的.学 ...

  3. Spring框架学习1

    AnonymouL 兴之所至,心之所安;尽其在我,顺其自然 新随笔 管理   Spring框架学习(一)   阅读目录 一. spring概述 核心容器: Spring 上下文: Spring AOP ...

  4. spring 框架学习网站

    spring 框架学习网站 NO1 http://www.mkyong.com NO2 https://spring.io/docs/reference

  5. Spring框架学习之IOC(二)

    Spring框架学习之IOC(二) 接着上一篇的内容,下面开始IOC基于注解装配相关的内容 在 classpath 中扫描组件 <context:component-scan> 特定组件包 ...

  6. Spring框架学习之IOC(一)

    Spring框架学习之IOC(一) 先前粗浅地学过Spring框架,但当时忙于考试及后期实习未将其记录,于是趁着最近还有几天的空闲时间,将其稍微整理一下,以备后期查看. Spring相关知识 spri ...

  7. Spring框架学习笔记(5)——Spring Boot创建与使用

    Spring Boot可以更为方便地搭建一个Web系统,之后服务器上部署也较为方便 创建Spring boot项目 1. 使用IDEA创建项目 2. 修改groupid和artifact 3. 一路n ...

  8. Spring框架学习总结(上)

    目录 1.Spring的概述 2.Spring的入门(IOC) 3.Spring的工厂类 4.Spring的配置 5.Spring的属性注入 6.Spring的分模块开发的配置 @ 1.Spring的 ...

  9. Spring框架学习笔记(8)——spring boot+mybatis plus+mysql项目环境搭建

    之前写的那篇Spring框架学习笔记(5)--Spring Boot创建与使用,发现有多小细节没有提及,,正好现在又学习了mybatis plus这款框架,打算重新整理一遍,并将细节说清楚 1.通过I ...

  10. Spring框架学习笔记(1)

    Spring 框架学习笔记(1) 一.简介 Rod Johnson(spring之父) Spring是分层的Java SE/EE应用 full-stack(服务端的全栈)轻量级(跟EJB比)开源框架, ...

随机推荐

  1. 基于modelsim-SE的专业进阶仿真流程

    基于modelsim-SE的专业进阶仿真流程 通过<基于modelsim-SE的简单仿真流程>和<调用altera IP核的仿真流程>是否感受到仿真流程中的繁琐步骤,特别是在m ...

  2. 初探Socket

    使用Socket Socket是两台主机之间的一个连接,它可以完成7个操作. 连接远程机器 发送数据 接收数据 关闭连接 绑定端口 监听入站数据 在绑定端口上接受来自远程机器的连接 Java中的Soc ...

  3. 使用UITableView展示数据

    TableView主要用于展示数据,类似于Android中的ListView. 我们可以通过两个方式使用TableView.第一种是直接使用TableView类.第二种是通过UITableViewCo ...

  4. 【Quartz】将定时任务持久化到数据库

    之前的文章所做的demo是将定时任务的信息保存在内存中的,见以下配置 org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore 如果,我们需要在 ...

  5. [转]Excel导入异常Cannot get a text value from a numeric cell解决

    原文地址:http://blog.csdn.net/ysughw/article/details/9288307 POI操作Excel时偶尔会出现Cannot get a text value fro ...

  6. COGS2531. [HZOI 2016]函数的美 打表+欧拉函数

    题目:http://cogs.pw/cogs/problem/problem.php?pid=2533 这道题考察打表观察规律. 发现对f的定义实际是递归式的 f(n,k) = f(0,f(n-1,k ...

  7. [转]mysql 视图

    转载自http://blog.csdn.net/evankaka/article/details/47071133 一. 视图概述 视图是一个虚拟表,其内容由查询定义.带来许多好处: 1. 视图能简化 ...

  8. ThinkPhp 3.2 数据的连贯操作

    ThinkPHP模型基础类提供的连贯操作方法(也有些框架称之为链式操作),可以有效的提高数据存取的代码清晰度和开发效率,并且支持所有的CURD操作. 使用也比较简单, 假如我们现在要查询一个User表 ...

  9. Zabbix监控

    安装zabbix首先需要安装Nginx+Mysql+PHP,然后再安装zabbix 安装zabbix1:创建用户及组: groupadd zabbix useradd -g zabbix zabbix ...

  10. JAVA中ListIterator和Iterator详解与辨析

    在使用Java集 合的时候,都需要使用Iterator.但是java集合中还有一个迭代器ListIterator,在使用List.ArrayList. LinkedList和Vector的时候可以使用 ...