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声明,都报空指针 ...
随机推荐
- VS2013无法启动 IIS Express Web解决办法
开发环境:windows8.1+VS2013 使用VS2013有一段时间了,因前期都是编写C/S程序,没有使用到B/S调试器.前几日,创建了一个MVC项目,突然发现VS2013无法调试,报了这样的错. ...
- 教程三:Wechat库的使用
上一篇教程中我们提供了wechat的php的库,这里我们简要介绍一个这个库的源码和使用.这个库的主文件为`Wechat.php`,其余的几个文件都是为这个文件服务的,提供加解密,消息拼接等功能.`We ...
- 并行计算提升32K*32K点(32位浮点数) FFT计算速度(4核八线程E3处理器)
对32K*32K的随机数矩阵进行FFT变换,数的格式是32位浮点数.将产生的数据存放在堆上,对每一行数据进行N=32K的FFT,记录32K次fft的时间. 比较串行for循环和并行for循环的运行时间 ...
- hadoopfs: 未找到命令...
https://zhidao.baidu.com/question/240817305095236244.html 学习hadoop测试http://blog.csdn.net/thinkpadshi ...
- IIS7.0部署MVC/WebApi项目,报404.4错误
在web.config中添加如下的配置试试: <system.webServer> <modules runAllManagedModulesForAllRequests=" ...
- Linux下yum安装MySQL
写这篇文章的原因是:在刚开始使用Linux操作系统时想要搭建LAMP环境,于是开始在Google和百度上各种寻找资料,碰到了不是很多的问题后,我决定写这篇文章总结一下在Linux下yum安装MySQL ...
- [LeetCode] Permutations 全排列
Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the follow ...
- 【WPF】WPF 布局
1.window 类继承自 ContentControl 所以内部只能有一个元素2.遵循原则: 不应显示的设置元素(控件)尺寸,可以通过设置最大最小尺寸来限制大小 ...
- jQuery之核心API
1. jQuery.holdReady()方法:暂停或恢复.ready() 事件的执行.在$.holdReady()方法允许调用者延迟jQuery的ready事件.这种先进的功能,通常会被用来允许在 ...
- vue.js 第三课
1.构造器 constructor 2.属性和方法 properties methods 3.实例生命周期 instance_lifecycle 1.vue.js都是通过 var vm=new V ...