Spring注解
AccountController .java
Java代码
1. /**
2. * 2010-1-23
3. */
4. package org.zlex.spring.controller;
5.
6. import javax.servlet.http.HttpServletRequest;
7. import javax.servlet.http.HttpServletResponse;
8.
9. import org.springframework.beans.factory.annotation.Autowired;
10. import org.springframework.stereotype.Controller;
11. import org.springframework.web.bind.ServletRequestUtils;
12. import org.springframework.web.bind.annotation.RequestMapping;
13. import org.springframework.web.bind.annotation.RequestMethod;
14. import org.zlex.spring.service.AccountService;
15.
16. /**
17. *
18. * @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>
19. * @version 1.0
20. * @since 1.0
21. */
22. @Controller
23. @RequestMapping("/account.do")
24. public class AccountController {
25.
26. @Autowired
27. private AccountService accountService;
28.
29. @RequestMapping(method = RequestMethod.GET)
30. public void hello(HttpServletRequest request, HttpServletResponse response)
31. throws Exception {
32.
33. String username = ServletRequestUtils.getRequiredStringParameter(
34. request, "username");
35. String password = ServletRequestUtils.getRequiredStringParameter(
36. request, "password");
37. System.out.println(accountService.verify(username, password));
38. }
39. }
分段详述:
Java代码
1.
@Controller
2.
@RequestMapping("/account.do")
这两行注解,@Controller是告诉Spring容器,这是一个控制器类,@RequestMapping("/account.do")是来定义该控制器对应的请求路径(/account.do)
Java代码
1.
@Autowired
2.
private AccountService accountService;
这是用来自动织入业务层实现AccountService,有了这个注解,我们就可以不用写setAccountService()方法了!
同时,JSR-250标准注解,推荐使用@Resource来代替Spring专有的@Autowired注解。
引用
Spring 不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及@PreDestroy。
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按
byName自动注入罢了。@Resource有两个属性是比较重要的,分别是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Resource装配顺序
1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配(见2);如果没有匹配,则回退为一个原始类型(UserDao)进行匹配,如果匹配则自动装配;
1.6. @PostConstruct(JSR-250)
在方法上加上注解@PostConstruct,这个方法就会在Bean初始化之后被Spring容器执行(注:Bean初始化包括,实例化Bean,并装配Bean的属性(依赖注入))。
Java代码
1.@RequestMapping(method = RequestMethod.GET)
2.public void hello(HttpServletRequest request, HttpServletResponse response)
3. throws Exception {
4.
5. String username = ServletRequestUtils.getRequiredStringParameter(
6. request, "username");
7. String password = ServletRequestUtils.getRequiredStringParameter(
8. request, "password");
9. System.out.println(accountService.verify(username, password));
10.
}
注解@RequestMapping(method
= RequestMethod.GET)指定了访问方法类型。
注意,如果没有用这个注解标识方法,Spring容器将不知道那个方法可以用于处理get请求!
对于方法名,我们可以随意定!方法中的参数,类似于“HttpServletRequest
request, HttpServletResponse response”,只要你需要方法可以是有参也可以是无参
接口不需要任何Spring注解相关的东西,它就是一个简单的接口!
重要的部分在于实现层,如下所示:
AccountServiceImpl.java
Java代码
1./**
2. * 2010-1-23
3. */
4.package org.zlex.spring.service.impl;
5.
6.import org.springframework.beans.factory.annotation.Autowired;
7.import org.springframework.stereotype.Service;
8.import org.springframework.transaction.annotation.Transactional;
9.import org.zlex.spring.dao.AccountDao;
10.
import org.zlex.spring.domain.Account;
11.
import org.zlex.spring.service.AccountService;
12.
13.
/**
14.
*
15.
* @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>
16.
* @version 1.0
17.
* @since 1.0
18.
*/
19.
@Service
20.
@Transactional
21.
public class AccountServiceImpl implements AccountService {
22.
23.
@Autowired
24.
private AccountDao accountDao;
25.
26.
/*
27.
* (non-Javadoc)
28.
*
29.
* @see org.zlex.spring.service.AccountService#verify(java.lang.String,
30.
* java.lang.String)
31.
*/
32.
@Override
33.
public boolean verify(String username, String password) {
34.
35.
Account account = accountDao.read(username);
36.
37.
if (password.equals(account.getPassword())) {
38.
return true;
39.
} else {
40.
return false;
41.
}
42.
}
43.
44.
}
注意以下内容:
Java代码
1.@Service
2.@Transactional
注解@Service用于标识这是一个Service层实现,@Transactional用于控制事务,将事务定位在业务层,这是非常务实的做法!
这里我们没有提到注解@Component,共有4种“组件”式注解:
引用
@Component:可装载组件
@Repository:持久层组件
@Service:服务层组件
@Controller:控制层组件
这样spring容器就完成了控制层、业务层和持久层的构建。
在注解的方式(Spring3.0)中,你可以使用@Value来指定这个文件。
例如,我们想要在一个类中获得一个文件,可以这样写:
Java代码
1.@Value("/WEB-INF/database.properties")
2.private File databaseConfig;
如果这个properties文件已经正常在容器中加载,可以直接这样写:
Java代码
1.@Value("${jdbc.url}")
2.private String url;
获得这个url参数!
容器中加载这个Properties文件:
Xml代码
1.<util:properties id="jdbc" location="/WEB-INF/database.properties"/>
AccountController .java
Java代码
1.
/**
2.
* 2010-1-23
3.
*/
4.
package org.zlex.spring.controller;
5.
6.
import javax.servlet.http.HttpServletRequest;
7.
import javax.servlet.http.HttpServletResponse;
8.
9.
import org.springframework.beans.factory.annotation.Autowired;
10.
import org.springframework.stereotype.Controller;
11.
import org.springframework.web.bind.ServletRequestUtils;
12.
import org.springframework.web.bind.annotation.RequestMapping;
13.
import org.springframework.web.bind.annotation.RequestMethod;
14.
import org.zlex.spring.service.AccountService;
15.
16.
/**
17.
*
18.
* @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>
19.
* @version 1.0
20.
* @since 1.0
21.
*/
22.
@Controller
23.
@RequestMapping("/account.do")
24.
public class AccountController {
25.
26.
@Autowired
27.
private AccountService accountService;
28.
29.
@RequestMapping(method = RequestMethod.GET)
30.
public void hello(HttpServletRequest request, HttpServletResponse response)
31.
throws Exception {
32.
33.
String username = ServletRequestUtils.getRequiredStringParameter(
34.
request, "username");
35.
String password = ServletRequestUtils.getRequiredStringParameter(
36.
request, "password");
37.
System.out.println(accountService.verify(username, password));
38.
}
39.
}
分段详述:
Java代码
1.
@Controller
2.
@RequestMapping("/account.do")
这两行注解,@Controller是告诉Spring容器,这是一个控制器类,@RequestMapping("/account.do")是来定义该控制器对应的请求路径(/account.do)
Java代码
1.
@Autowired
2.
private AccountService accountService;
这是用来自动织入业务层实现AccountService,有了这个注解,我们就可以不用写setAccountService()方法了!
同时,JSR-250标准注解,推荐使用@Resource来代替Spring专有的@Autowired注解。
引用
Spring 不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及@PreDestroy。
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按
byName自动注入罢了。@Resource有两个属性是比较重要的,分别是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Resource装配顺序
1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配(见2);如果没有匹配,则回退为一个原始类型(UserDao)进行匹配,如果匹配则自动装配;
1.6. @PostConstruct(JSR-250)
在方法上加上注解@PostConstruct,这个方法就会在Bean初始化之后被Spring容器执行(注:Bean初始化包括,实例化Bean,并装配Bean的属性(依赖注入))。
Java代码
1.@RequestMapping(method = RequestMethod.GET)
2.public void hello(HttpServletRequest request, HttpServletResponse response)
3. throws Exception {
4.
5. String username = ServletRequestUtils.getRequiredStringParameter(
6. request, "username");
7. String password = ServletRequestUtils.getRequiredStringParameter(
8. request, "password");
9. System.out.println(accountService.verify(username, password));
10.
}
注解@RequestMapping(method
= RequestMethod.GET)指定了访问方法类型。
注意,如果没有用这个注解标识方法,Spring容器将不知道那个方法可以用于处理get请求!
对于方法名,我们可以随意定!方法中的参数,类似于“HttpServletRequest
request, HttpServletResponse response”,只要你需要方法可以是有参也可以是无参
接口不需要任何Spring注解相关的东西,它就是一个简单的接口!
重要的部分在于实现层,如下所示:
AccountServiceImpl.java
Java代码
1./**
2. * 2010-1-23
3. */
4.package org.zlex.spring.service.impl;
5.
6.import org.springframework.beans.factory.annotation.Autowired;
7.import org.springframework.stereotype.Service;
8.import org.springframework.transaction.annotation.Transactional;
9.import org.zlex.spring.dao.AccountDao;
10.
import org.zlex.spring.domain.Account;
11.
import org.zlex.spring.service.AccountService;
12.
13.
/**
14.
*
15.
* @author <a href="mailto:zlex.dongliang@gmail.com">梁栋</a>
16.
* @version 1.0
17.
* @since 1.0
18.
*/
19.
@Service
20.
@Transactional
21.
public class AccountServiceImpl implements AccountService {
22.
23.
@Autowired
24.
private AccountDao accountDao;
25.
26.
/*
27.
* (non-Javadoc)
28.
*
29.
* @see org.zlex.spring.service.AccountService#verify(java.lang.String,
30.
* java.lang.String)
31.
*/
32.
@Override
33.
public boolean verify(String username, String password) {
34.
35.
Account account = accountDao.read(username);
36.
37.
if (password.equals(account.getPassword())) {
38.
return true;
39.
} else {
40.
return false;
41.
}
42.
}
43.
44.
}
注意以下内容:
Java代码
1.@Service
2.@Transactional
注解@Service用于标识这是一个Service层实现,@Transactional用于控制事务,将事务定位在业务层,这是非常务实的做法!
这里我们没有提到注解@Component,共有4种“组件”式注解:
引用
@Component:可装载组件
@Repository:持久层组件
@Service:服务层组件
@Controller:控制层组件
这样spring容器就完成了控制层、业务层和持久层的构建。
在注解的方式(Spring3.0)中,你可以使用@Value来指定这个文件。
例如,我们想要在一个类中获得一个文件,可以这样写:
Java代码
1.@Value("/WEB-INF/database.properties")
2.private File databaseConfig;
如果这个properties文件已经正常在容器中加载,可以直接这样写:
Java代码
1.@Value("${jdbc.url}")
2.private String url;
获得这个url参数!
容器中加载这个Properties文件:
Xml代码
1.<util:properties id="jdbc" location="/WEB-INF/database.properties"/>
Spring注解的更多相关文章
- spring注解源码分析--how does autowired works?
1. 背景 注解可以减少代码的开发量,spring提供了丰富的注解功能.我们可能会被问到,spring的注解到底是什么触发的呢?今天以spring最常使用的一个注解autowired来跟踪代码,进行d ...
- spring 注解的优点缺点
注解与XML配置的区别 注解:是一种分散式的元数据,与源代码耦合. xml :是一种集中式的元数据,与源代码解耦. 因此注解和XML的选择上可以从两个角度来看:分散还是集中,源代码耦合/解耦. 注解的 ...
- spring注解说明之Spring2.5 注解介绍(3.0通用)
spring注解说明之Spring2.5 注解介绍(3.0通用) 注册注解处理器 方式一:bean <bean class="org.springframework.beans.fac ...
- 使用Spring注解来简化ssh框架的代码编写
目的:主要是通过使用Spring注解的方式来简化ssh框架的代码编写. 首先:我们浏览一下原始的applicationContext.xml文件中的部分配置. <bean id="m ...
- spring注解scheduled实现定时任务
只想说,spring注解scheduled实现定时任务使用真的非常简单. 一.配置spring.xml文件 1.在beans加入xmlns:task="http://www.springfr ...
- [转]Spring 注解总结
原文地址:http://blog.csdn.net/wangshfa/article/details/9712379 一 注解优点?注解解决了什么问题,为什么要使用注解? 二 注解的来龙去脉(历史) ...
- eclipes的Spring注解SequenceGenerator(name="sequenceGenerator")报错的解决方式
eclipes的Spring注解SequenceGenerator(name="sequenceGenerator")报错的解决方式 右键项目打开Properties—>JA ...
- Spring注解【非单例】
花了至少一整天的时间解决了这个问题,必须记录这个纠结的过程,问题不可怕,思路很绕弯. 为了能说清楚自己的问题,我都用例子来模拟. 我有一个类MyThread是这样的: @Service public ...
- spring注解方式在一个普通的java类里面注入dao
spring注解方式在一个普通的java类里面注入dao @Repositorypublic class BaseDaoImpl implements BaseDao {这是我的dao如果在servi ...
随机推荐
- 闰秒导致MySQL服务器的CPU sys过高
今天,有个哥们碰到一个问题,他有一个从库,只要是启动MySQL,CPU使用率就非常高,其中sys占比也比较高,具体可见下图. 注意:他的生产环境是物理机,单个CPU,4个Core. 于是,他抓取了CP ...
- 使用 .NET WinForm 开发所见即所得的 IDE 开发环境,实现不写代码直接生成应用程序
直接切入正题,这是我09年到11年左右业余时间编写的项目,最初的想法很简单,做一个能拖拖拽拽就直接生成应用程序的工具,不用写代码,把能想到的业务操作全部封装起来,通过配置的方式把这些业务操作组织起来运 ...
- 传播正能量——做一个快乐的程序员
引子 今天在博客园看到施瓦小辛格的文章我们搞开发的为什么会感觉到累,顿时有感而发.自己本来不擅长写文章,更不擅长写这种非技术性的文章,但是在思绪喷薄之际,还是止不住有很多话要说.针对从客观上说&quo ...
- Partition2:对表分区
在SQL Server中,普通表可以转化为分区表,而分区表不能转化为普通表,普通表转化成分区表的过程是不可逆的,将普通表转化为分区表的方法是: 在分区架构(Partition Scheme)上创建聚集 ...
- Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示
Dapper的牛逼就不扯蛋了,答应群友做个入门Demo的,现有园友需要,那么公开分享一下: 完整Demo:http://pan.baidu.com/s/1i3TcEzj 注 意 事 项:http:// ...
- 如何避免git每次提交都输入密码
在ubuntu系统中,如何避免git每次提交都输入用户名和密码?操作步聚如下:1: cd 回车: 进入当前用户目录下:2: vim .git-credentials (如果没有安装vim 用其它编辑器 ...
- [原] KVM 虚拟化原理探究 —— 目录
KVM 虚拟化原理探究 -- 目录 标签(空格分隔): KVM KVM 虚拟化原理探究(1)- overview KVM 虚拟化原理探究(2)- QEMU启动过程 KVM 虚拟化原理探究(3)- CP ...
- 集合(set)-Python3
set 的 remove() 和 discard() 方法介绍. 函数/方法名 等价操作符 说明 所有集合类型 len(s) 集合基数:集合s中元素个数 set([obj]) 可变集合工 ...
- Cesium简介以及离线部署运行
Cesium简介 cesium是国外一个基于JavaScript编写的使用WebGL的地图引擎,一款开源3DGIS的js库.cesium支持3D,2D,2.5D形式的地图展示,可以自行绘制图形,高亮区 ...
- 一个软件开发者的BPM之路
我是小林,一名普通的软件工程师,从事BPM(业务流程管理)软件开发工作.我没有几十年的技术底蕴,无法像大牛们一样高谈阔论,品评BPM开发之道:也不是资深的流程管理专家,能与大家分析流程管理的时弊.我只 ...