3.0、Spring-注入
一、Spring的基本介绍:Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架。
1、核心思想:IOC(控制反转,或者成为反射)和AOP(面向切面编程),依赖注入(DI)和控制反转(IOC)是同一个概念的不同表述。
这篇帖子写得不错:http://jinnianshilongnian.iteye.com/blog/1413846;
2、作用:管理整个项目。
3、注入:在Spring的配置文件里配置Dao、Service、Action的Bean,并让Dao层引入数据源,Service引入Dao,Action引入Service。Dao层要继承数据源的对象HibernateDaoSupport,service要引入Dao的接口并添加Set方法。
四种依赖注入反式:setter注入、构造器注入、静态工厂的方法注入、实例工厂的方法注入。
4、切面:通知和切点就构成了切面。
二、注入举例:
1、创建一个新的项目,拷贝一个applicationContext.xml文件到src目录下面,添加Spring框架所需要的jar包:org.springframework.core/beans/context(先只添加这三个最主要的jar包,以后差什么根据提示再往里面加,一般加包的时候采用宁少勿多的原则)。
2、新建一个包:com.st.bean1,并在这个包下面新建一个UserBean类:
package com.st.bean1; public class UserBean {
private String userName;
private String password; @Override
public String toString() {
return "UserBean [userName=" + userName + ", password=" + password
+ "]";
}
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;
}
}
3、编辑applicationContext.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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<bean id="user" class="com.st.bean1.UserBean">
<!-- setter注入,依赖于set方法 -->
<property name="userName" value="陈泽俊"></property>
<property name="password" value="123456"></property>
</bean>
</beans>
4、新建一个测试类BeanTest1
package com.st.bean1; import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class BeanTest1 {
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserBean user = context.getBean("user",UserBean.class);
System.out.println(user);
}
}
5、更改配置文件applicationContext.xml中的类容实现构造器注入:
a)、在UserBean类中添带所有的参数加构造方法:(需要注意的是一般在添加了有参构造器的同时还添加一个无参构造器)
b)、修改.xml配置文件中的类容:
<bean id="user" class="com.st.bean1.UserBean">
<!-- setter注入,依赖于set方法 -->
<!-- <property name="userName" value="陈泽俊"></property>
<property name="password" value="123456"></property> --> <!-- 构造器注入,依赖于构造方法 -->
<!-- 方法一:必须要按构造方法的顺序来写 -->
<!-- <constructor-arg value="陈泽俊"/>
<constructor-arg value="234567"/> --> <!-- 方法二:按构造方法的参数的顺序的小标来写,下标从0开始 -->
<!-- <constructor-arg index="1" value="234567"/>
<constructor-arg index="0" value="陈泽俊"/> --> <!-- 方法三:直接通过构造方法的参数的属性名来写 -->
<constructor-arg name="userName" value="chenzejun" />
<constructor-arg name="password" value="123456" />
</bean>
6、如果新建一个类AddrBean:
package com.st.bean1; public class AddrBean {
private String addr;
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
@Override
public String toString() {
return "AddrBean [addr=" + addr + "]";
}
}
在UserBean中,引入这个类,即将AddrBean作为UserBean这个类中的一个属性:private AddrBean addr(注意添加set方法并重写toString方法);这时要在xml配置文件中注入addr就需要在xml文件中新建一个<bean>标签,再通过<property>标签中的ref属性将这个<bean>标签引入:
<bean id="user" class="com.st.bean1.UserBean">
<constructor-arg name="userName" value="chenzejun" />
<constructor-arg name="password" value="123456" />
<property name="addr" ref="addr"/>
</bean>
<bean id="addr" class="com.st.bean1.AddrBean">
<property name="addr" value="湖北民族学院"></property>
</bean>
(上面的配置文件中的<property> 标签中的类容也可以这样来写,但需要注意的是<ref>标签中bean和local属性的区别)
<property name="addr">
<!-- 应用的整个Spring文件里面的 -->
<ref bean="addr"/>
</property>
<property name="addr" >
<!-- 引入的是本文件里面的 -->
<ref local="addr"/>
</property>
这时可用上面的BeanTest1类中的test方法进行测试:输出为“UserBean [userName=chenzejun, password=123456, addr=AddrBean [addr=湖北民族学院]]”。
7、在实际开发过程中,一般会有多个Spring的配置文件,这时可以设置一个总的.xml文件,在这个文件里面引入其他的xml文件。就像Struts2配置中,每个Bean类都对应的有一个xml文件,但是这些xml文件都被映射到struts2.xml文件中,最终只需要引入struts2.xml文件即可。以上面的第6步为例:
a)、复制一个applicationContext.xml文件到com.st.bean1这个包下面,并重命名为applicationContext1.xml,并编写的关于AddrBean这个类的注入方式:
<bean id="address" class="com.st.bean1.AddrBean">
<property name="addr" value="湖北民族学院" />
</bean>
b)、在applicationContext.xml文件中通过<import>标签引入applicationContext1.xml文件,再用6中的方式一样可以达到相同的效果:
<import resource="com/st/bean1/applicationContext1.xml"/>
<bean id="user" class="com.st.bean1.UserBean">
<constructor-arg name="userName" value="chenzejun" />
<constructor-arg name="password" value="123456" />
<property name="addr" ref="address"/>
</bean>
</beans>
8、数组的注入
a)新建一个包com.st.bean2,在包里面添加一个CollectionBean类:
package com.st.bean2; import java.util.List;
import java.util.Map; public class CollectionBean {
private String name;
private List<String> list;
private Map<String,Object> map;
@Override
public String toString() {
return "CollectionBean [name=" + name + ", list=" + list + ", map="
+ map + "]";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Map<String, Object> getMap() {
return map;
}
public void setMap(Map<String, Object> map) {
this.map = map;
}
}
b)、在applicationContext.xml文件中添加collection的注入配置
<bean id="collection" class="com.st.bean2.CollectionBean">
<property name="name" value="张三"/>
<!-- 设定list集合中注入的数据 -->
<property name="list" >
<list>
<value>张三</value>
<value>李四</value>
<value>王五</value>
</list>
</property>
<!-- 设定注入map集合中的数据 -->
<property name="map">
<map>
<!-- 设定键值和数据 -->
<entry key="key1" value="小明"/>
<entry key="key2" value="小红"/>
<entry key="key3" value="小黑"/>
</map>
</property> </bean>
c)、在TestBean中添加测试代码:
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
CollectionBean collection = context.getBean("collection",CollectionBean.class);
System.out.println(collection);
}
d)、输出结果为“CollectionBean [name=张三, list=[张三, 李四, 王五], map={key1=小明, key2=小红, key3=小黑}]”。
三、Spring Web应用举例:
1、在上述项目的基础上新建四个包 com.st.bean/dao/service/servlet 并在这些包中添加相应的接口和实现类:
a)、在bean下面创建UserBean类:
package com.st.bean; public class UserBean {
private String userName;
private String password;
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;
}
@Override
public String toString() {
return "UserBean [userName=" + userName + ", password=" + password
+ "]";
}
}
b)、在dao下面添加UserDao接口及该接口的实现类UserDaoIm,实现类的类容为:
package com.st.dao; import com.st.bean.UserBean; public class UserDaoIm implements UserDao {
public UserBean queryUser(UserBean user) {
System.out.println(user);
return user;
}
}
c)、在service中添加UserService接口,并添加该接口的实现类UserServiceIm,实现类中的类容为:
package com.st.service; import com.st.bean.UserBean;
import com.st.dao.UserDao; public class UserServiceIm implements UserService { private UserDao dao;
public UserBean queryUser(UserBean user) {
return dao.queryUser(user);
}
public void setDao(UserDao dao) {
this.dao = dao;
}
}
d)、在applicationContext.xml文件中配置注入:
<bean id="userDao" class="com.st.dao.UserDaoIm"></bean>
<bean id="userService" class="com.st.service.UserServiceIm">
<property name="dao" ref="userDao"></property>
</bean>
e)、在index.jsp页面编写一个简单的登陆界面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>用户登陆</title>
</head>
<body>
<form method="post" action="<%=request.getContextPath()%>/userServlet">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" id="userName" name="userName" value=""/></td>
</tr>
<tr>
<td>密 码:</td>
<td><input type="password" id="password" name="password" value=""/></td>
</tr>
<tr>
<td><input type="submit" value="登陆"/></td>
<td><input type="reset" value="重置"/></td>
</tr>
</table>
</form>
</body>
</html>
f)、在web.xml文件中添加servlet的配置:
<servlet>
<servlet-name>userServlet</servlet-name>
<servlet-class>com.st.servlet.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>userServlet</servlet-name>
<url-pattern>/userServlet</url-pattern>
</servlet-mapping>
g)、在servlet中添加UserServlet类(注意不要忘记了该类需要继承HttpServlet类):
package com.st.servlet; import java.io.IOException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; import com.st.bean.UserBean;
import com.st.service.UserService; public class UserServlet extends HttpServlet{ @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
UserBean user = new UserBean();
user.setUserName(req.getParameter("userName"));
user.setPassword(req.getParameter("password"));
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService service = context.getBean("userService", UserService.class);
UserBean user1 = service.queryUser(user);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.doGet(req, resp);
}
}
上述就是Spring框架的一个简单的搭建过程,Spring的作用就是管理整个项目。
3.0、Spring-注入的更多相关文章
- Spring注入JPA+JPA事务管理
本例实现的是Spring注入JPA 和 使用JPA事务管理.JPA是sun公司开发的一项新的规范标准.在本质上来说,JPA可以看作是Hibernate的一个子集:然而从功能上来说,Hibernate是 ...
- spring注入简记
我们知道对象是交给容器来管理的那么 init() destroy():可以在bean配置中设置对象初识化前执行和销毁后执行 int-delay=""表示是否延迟实例化即容器实例时还 ...
- 项目中Spring注入报错小结
之前在做单元测试时采用注解方式进行service对象的注入,但运行测试用例时对象要注入的service对象总是空的,检查下spring配置文件,我要配置的bean类xml文件已经包含到spring要加 ...
- Spring注入
Spring注入 Spring注入是指在启动Spring容器加载bean配置的时候,完成对变量的赋值行为. 常用的两种注入方式: setter注入 构造注入 <?xml version=&quo ...
- 谈谈Spring 注入properties文件总结
本篇谈谈Spring 注入properties文件总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 spring提供了多种方式来注入properties文件,本文做一个 ...
- java:Spring框架1(基本配置,简单基础代码模拟实现,spring注入(DI))
1.基本配置: 步骤一:新建项目并添加spring依赖的jar文件和commons-logging.xx.jar: 步骤二:编写实体类,DAO及其实现类,Service及其实现类; 步骤三:在src下 ...
- SSH框架系列:Spring读取配置文件以及获取Spring注入的Bean
分类: [java]2013-12-09 16:29 1020人阅读 评论(0) 收藏 举报 1.简介 在SSH框架下,假设我们将配置文件放在项目的src/datasource.properties路 ...
- Spring注入中byType和byName的总结
1.首先,区分清楚什么是byType,什么是byName. <bean id="userServiceImpl" class="cn.com.bochy.servi ...
- spring注入参数详解
spring注入参数详解 在Spring配置文件中, 用户不但可以将String, int等字面值注入到Bean中, 还可以将集合, Map等类型的数据注入到Bean中, 此外还可以注入配置文件中定义 ...
- 线程中无法实例化spring注入的服务的解决办法
问题描述 在Java Web应用中采用多线程处理数据,发现Spring注入的服务一直报NullPointerException.使用注解式的声明@Resource和XML配置的bean声明,都报空指针 ...
随机推荐
- Chrome Developer Tools:Timeline Panel说明
一.Timeline panel 概况 Timeline工具栏可以详细检测出Web应用在加载过程中,时间花费情况的概览.这些应用包括下载资源,处理DOM事件, 页面布局渲染或者向屏幕绘制元素. 如下图 ...
- Linux进程学习
进程与进程管理: 清屏:system("clear"); //#include <signal.h> 进程环境与进程属性: 什么是进程:简单的说,进程就是程序的一次执行 ...
- Batis-iBatis基本操作(增删改查)
Batis-iBatis基本操作(增删改查) 时间 2014-04-10 17:55:20 CSDN博客 原文 http://blog.csdn.net/mazhaojuan/article/de ...
- 机器学习之sklearn——SVM
sklearn包对于SVM可输出支持向量,以及其系数和数目: print '支持向量的数目: ', clf.n_support_ print '支持向量的系数: ', clf.dual_coef_ p ...
- Linux 中 SVN 重启关闭
a.启动SVN svnserve -d -r /A/B/svn/ 其中 -d 表示守护进程, -r 表示在后台执行 /A/B/svn/ 为svn的安装目录 b.关闭SVN 这里采取linux杀死进程的 ...
- docker 学习过程
参考: http://git.oschina.net/search?search=csphere&type=project&language=&page=2&condi ...
- iOS App上架流程(2016详细版)
iOS App上架流程(2016详细版) 原文地址:http://www.jianshu.com/p/b1b77d804254 感谢大神整理的这么详细 一.前言: 作为一名iOSer,把开发出来的Ap ...
- git 命令学习
last-update: 2016年10月27日 1. git stash 简短描述 当你正在进行项目中某一部分的工作,但是里面的东西处于一个比较杂乱的状态,但是却想要切换到其他分支.问题是,你不想提 ...
- What's Security
研究安全应该时常问自己这个问题,什么是安全,什么是安全,什么是安全,安全的本质是什么,只有理解了安全的本质,才能成功的设计一个安全方案. 现在的感觉是没有绝对的安全,所谓的'安全'其实都只不过是增加攻 ...
- pip安装使用详解(转)
pip类似RedHat里面的yum,安装Python包非常方便.本节详细介绍pip的安装.以及使用方法. 1.pip下载安装 1.1 pip下载 1 # wget "https://py ...