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注解的更多相关文章

  1. spring注解源码分析--how does autowired works?

    1. 背景 注解可以减少代码的开发量,spring提供了丰富的注解功能.我们可能会被问到,spring的注解到底是什么触发的呢?今天以spring最常使用的一个注解autowired来跟踪代码,进行d ...

  2. spring 注解的优点缺点

    注解与XML配置的区别 注解:是一种分散式的元数据,与源代码耦合. xml :是一种集中式的元数据,与源代码解耦. 因此注解和XML的选择上可以从两个角度来看:分散还是集中,源代码耦合/解耦. 注解的 ...

  3. spring注解说明之Spring2.5 注解介绍(3.0通用)

    spring注解说明之Spring2.5 注解介绍(3.0通用) 注册注解处理器 方式一:bean <bean class="org.springframework.beans.fac ...

  4. 使用Spring注解来简化ssh框架的代码编写

     目的:主要是通过使用Spring注解的方式来简化ssh框架的代码编写. 首先:我们浏览一下原始的applicationContext.xml文件中的部分配置. <bean id="m ...

  5. spring注解scheduled实现定时任务

    只想说,spring注解scheduled实现定时任务使用真的非常简单. 一.配置spring.xml文件 1.在beans加入xmlns:task="http://www.springfr ...

  6. [转]Spring 注解总结

    原文地址:http://blog.csdn.net/wangshfa/article/details/9712379 一 注解优点?注解解决了什么问题,为什么要使用注解? 二 注解的来龙去脉(历史) ...

  7. eclipes的Spring注解SequenceGenerator(name="sequenceGenerator")报错的解决方式

    eclipes的Spring注解SequenceGenerator(name="sequenceGenerator")报错的解决方式 右键项目打开Properties—>JA ...

  8. Spring注解【非单例】

    花了至少一整天的时间解决了这个问题,必须记录这个纠结的过程,问题不可怕,思路很绕弯. 为了能说清楚自己的问题,我都用例子来模拟. 我有一个类MyThread是这样的: @Service public ...

  9. spring注解方式在一个普通的java类里面注入dao

    spring注解方式在一个普通的java类里面注入dao @Repositorypublic class BaseDaoImpl implements BaseDao {这是我的dao如果在servi ...

随机推荐

  1. 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

    阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...

  2. RPC 使用中的一些注意点

    最近线上碰到一点小问题,分析其原因发现是出在对 RPC 使用上的一些细节掌握不够清晰导致.很多时候我们做业务开发会把 RPC 当作黑盒机制来使用,但若不对黑盒的工作原理有个基本掌握,也容易犯一些误用的 ...

  3. setTimeout 的黑魔法

    setTimeout,前端工程师必定会打交道的一个函数.它看上去非常的简单,朴实.有着一个很不平凡的名字--定时器.让年少的我天真的以为自己可以操纵未来.却不知朴实之中隐含着惊天大密.我还记得我第一次 ...

  4. 香蕉云APP,2016下半年开发日记

    2016-6-17  数据库设计不应该过多依赖范式,适度的冗余可以加快搜索速度,在服务器的配置还可以的情况下,可以采用冗余来解决查找慢的问题.还一个是要选择好数据库引擎,例如 InnoDB 和 myi ...

  5. 水平可见直线 bzoj 1007

    水平可见直线 (1s 128M) lines [问题描述] 在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆 ...

  6. Linux环境下shell和vim中乱码原因及消除办法

    shell和vim中乱码原因及消除办法 作者:Jack47 在Linux下开发,经常遇到乱码问题:shell或者vim中显示不了中文,或者能够显示,但不能输入中文.每次都是上网去搜,或者同事告诉我一些 ...

  7. Thinking in Unity3D:基于物理着色(PBS)的材质系统

    关于<Thinking in Unity3D> 笔者在研究和使用Unity3D的过程中,获得了一些Unity3D方面的信息,同时也感叹Unity3D设计之精妙.不得不说,笔者最近几年的引擎 ...

  8. Visual Studio 实用扩展推荐

    Visual Studio 拥有非常不错的可扩展性,在之前的文章中,我也给大家示范了如何进行编辑器的扩展(详见文末参考资源).在本篇文章中,我将介绍几款非常实用的扩展,从而帮助我们提高开发效率. C# ...

  9. Entity Framework 6 Recipes 2nd Edition(9-6)译->管理断开时的并发

    9-6. 管理断开时的并发 问题 想要确保只接受在WCF客户端并发令牌未被修改的实体. 解决方案 我们有一个如Figure 9-6所示的模型. Figure 9-6订单实体模型 我们想通过WCF服务来 ...

  10. stanford corenlp自定义切词类

    stanford corenlp的中文切词有时不尽如意,那我们就需要实现一个自定义切词类,来完全满足我们的私人定制(加各种词典干预).上篇文章<IKAnalyzer>介绍了IKAnalyz ...