白话Spring(中级篇)---注解(2)

[一知半解,就是给自己挖坑]

接上文,我们继续来介绍Spring中的常用注解。

--------------------------------------------------------------------------------------------------------------------------------------------------------

清单:7:@Controller

@Controller对应表现层的Bean,也就是*Action,*Controller例如:

@Controller
2 @Scope("prototype")
3 public class UserAction extends BaseAction<User>{
4 ……
5 }
@Controller
2 @Scope("prototype")
3 public class UserController extends BaseController <User>{
4 ……
5 }

使用@Controller注解标识UserAction之后,就表示要把UserAction交给Spring容器管理,在Spring容器中会存在一个名字为"userAction"的action,这个名字是根据UserAction类名来取的。注意:如果@Controller不指定其value【@Controller】,则默认的bean名字为这个类的类名首字母小写,如果指定value【@Controller(value="UserAction")】或者【@Controller("UserAction")】,则使用value作为bean的名字。

这里的UserAction还使用了@Scope注解,@Scope("prototype")表示将Action的范围声明为原型,可以利用容器的scope="prototype"来保证每一个请求有一个单独的Action来处理,避免struts中Action的线程安全问题。spring 默认scope 是单例模式(scope="singleton"),这样只会创建一个Action对象,每次访问都是同一Action对象,数据不安全,struts2 是要求每次次访问都对应不同的Action,scope="prototype" 可以保证当有请求的时候都创建一个Action对象

-------------------------------------------------------------------------------------------------------------------------------------

清单:8:@Service

@Service对应的是业务层Bean,例如:

 @Service("userService")
2 public class UserServiceImpl implements UserService {
3 ………
4 }
@Service("userService")注解是告诉Spring,当Spring要创建UserServiceImpl的的实例时,bean的名字必须叫做"userService",这样当Action需要使用UserServiceImpl的的实例时,就可以由Spring创建好的"userService",然后注入给Action:在Action只需要声明一个名字叫“userService”的变量来接收由Spring注入的"userService"即可,具体代码如下:
// 注入userService
2 @Resource(name = "userService")
3 private UserService userService;
注意:在Action(controller层)声明的“userService”变量的类型必须是“UserServiceImpl”或者是其父类“UserService”,否则由于类型不一致而无法注入。由于Action中的声明的“userService”变量使用了@Resource注解去标注,并且指明了其name = "userService",这就等于告诉Spring,说我Action(controller层)要实例化一个“userService”,你Spring快点帮我实例化好,然后给我,当Spring看到userService变量上的@Resource的注解时,根据其指明的name属性可以知道,Action(controller层)中需要用到一个UserServiceImpl的实例,此时Spring就会把自己创建好的名字叫做"userService"的UserServiceImpl的实例注入给Action(controller层)中的“userService”变量,帮助Action(controller层)完成userService的实例化,这样在Action(controller层)中就不用通过“UserService userService = new UserServiceImpl();”这种最原始的方式去实例化userService了。

       如果没有Spring,那么当Action(controller层)需要使用UserServiceImpl时,必须通过“UserService userService = new UserServiceImpl();”主动去创建实例对象,但使用了Spring之后,Action(controller层)要使用UserServiceImpl时,就不用主动去创建UserServiceImpl的实例了,创建UserServiceImpl实例已经交给Spring来做了,Spring把创建好的UserServiceImpl实例给Action(controller层),Action(controller层)拿到就可以直接用了。

      Action(controller层)由原来的主动创建UserServiceImpl实例后就可以马上使用,变成了被动等待由Spring创建好UserServiceImpl实例之后再注入给Action(controller层),Action(controller层)才能够使用。这说明Action(controller层)对“UserServiceImpl”类的“控制权”已经被“反转”了,原来主动权在自己手上,自己要使用“UserServiceImpl”类的实例,自己主动去new一个出来马上就可以使用了,但现在自己不能主动去new“UserServiceImpl”类的实例,new“UserServiceImpl”类的实例的权力已经被Spring拿走了,只有Spring才能够new“UserServiceImpl”类的实例,而Action(controller层)只能等Spring创建好“UserServiceImpl”类的实例后,再“恳求”Spring把创建好的“UserServiceImpl”类的实例给他,这样他才能够使用“UserServiceImpl”,这就是Spring核心思想“控制反转”,也叫“依赖注入”。

    “依赖注入”也很好理解,Action(controller层)需要使用UserServiceImpl干活,那么就是对UserServiceImpl产生了依赖,Spring把Acion(controller层)需要依赖的UserServiceImpl注入(也就是“给”)给Action,这就是所谓的“依赖注入”。对Action(controller层)而言,Action(controller层)依赖什么东西,就请求Spring注入给他,对Spring而言,Action(controller层)需要什么,Spring就主动注入给他。

-------------------------------------------------------------------------------------------------------------------------------------

清单:9:@ Repository

@Repository对应数据访问层Bean ,例如:

@Repository(value="userDao")
2 public class UserDaoImpl extends BaseDaoImpl<User> {
3 ………
4 }

@Repository(value="userDao")注解是告诉Spring,让Spring创建一个名字叫“userDao”的UserDaoImpl实例。

当Service需要使用Spring创建的名字叫“userDao”的UserDaoImpl实例时,就可以使用@Resource(name = "userDao")注解告诉Spring,Spring把创建好的userDao注入给Service即可。

1 // 注入userDao,从数据库中根据用户Id取出指定用户时需要用到
2 @Resource(name = "userDao")
3 private BaseDao<User> userDao;

-------------------------------------------------------------------------------------------------------------------------------------

清单:10:RequestMapping

RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

RequestMapping注解有六个属性,下面我们把她分成三类进行说明。

A. value与 method;

value:指定请求的实际地址,指定的地址可以是URI Template 模式;

value的uri值为以下三类:

1) 可以指定为普通的具体值;

@RequestMapping("/appointments")  
public class AppointmentsController { 
...
}

2) 可以指定为含有某变量的一类值;

@RequestMapping(value="/owners/{ownerId}", method=RequestMethod.GET)  
public String findOwner(@PathVariable String ownerId, Model model) {  
  Owner owner = ownerService.findOwner(ownerId);    
  model.addAttribute("owner", owner);    
  return "displayOwner";   
} 

3) 可以指定为含正则表达式的一类值;

@RequestMapping("/spring-web/{symbolicName:[a-z-]+}-{version:\d\.\d\.\d}.{extension:\.[a-z]}")  
  public void handle(@PathVariable String version, @PathVariable String extension) {      
    // ...  
  }  
} 

method:指定请求的method类型, GET、POST、PUT、DELETE等;

 @RequestMapping(method = RequestMethod.GET)  
    public Map<String, Appointment> get() {  
        return appointmentBook.getAppointmentsForToday();  
    }  

B. consumes与produces;

consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;

@Controller  
@RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json")  
public void addPet(@RequestBody Pet pet, Model model) {      
    // implementation omitted  
} 

produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;同时暗示了返回的内容类型为application/json;

@Controller  
@RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, produces="application/json")  
@ResponseBody  
public Pet getPet(@PathVariable String petId, Model model) {      
    // implementation omitted  
} 

C. params与headers;

params:指定request中必须包含某些参数值是,才让该方法处理。

如:仅处理请求中包含了名为“myParam”,值为“myValue”的请求;
@Controller  
@RequestMapping("/owners/{ownerId}")  
public class RelativePathUriTemplateController {  
  @RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, params="myParam=myValue")  
  public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {      
    // implementation omitted  
  }  
}

headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。

 如:仅处理request的header中包含了指定“Refer”请求头和对应值为“http://www.ifeng.com/”的请求;

@Controller  
@RequestMapping("/owners/{ownerId}")  
public class RelativePathUriTemplateController {  
@RequestMapping(value = "/pets", method = RequestMethod.GET, headers="Referer=http://www.ifeng.com/")  
  public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {      
    // implementation omitted  
  }  
}  

-------------------------------------------------------------------------------------------------------------------------------------

至此,白话Spring(中级篇)---注解(2)结束


文章出处:
http://www.cnblogs.com/xdp-gacl/p/3495887.html

http://blog.csdn.net/kobejayandy/article/details/12690041






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以通过以下步骤手动上传使用 vue-simple-uploader: 1. 首先,确保你已经安装了 vue-simple-uploader。你可以通过 npm 或 yarn 进行安装: ```bash npm install vue-simple-uploader ``` ```bash yarn add vue-simple-uploader ``` 2. 在你的 Vue 组件中导入 uploader 组件: ```javascript import Uploader from 'vue-simple-uploader' ``` 3. 在 Vue 组件的 `components` 属性中注册 uploader 组件: ```javascript components: { Uploader }, ``` 4. 在模板中使用 `uploader` 组件,并设置必要的属性和事件监听器: ```html <template> <div> <uploader :url="uploadUrl" :auto-upload="false" @file-added="onFileAdded" @file-success="onFileSuccess" ></uploader> <button @click="upload">手动上传</button> </div> </template> ``` 在上面的代码中,`uploadUrl` 是指向服务器端上传处理的 URL。`auto-upload` 属性设置为 `false`,以便手动触发上传。 5. 在 Vue 组件的方法中定义事件处理程序: ```javascript methods: { onFileAdded(file) { // 文件添加事件处理程序 console.log('文件已添加', file) }, onFileSuccess(response, file) { // 文件上传成功事件处理程序 console.log('文件上传成功', response, file) }, upload() { // 手动触发上传 this.$refs.uploader.upload() } }, ``` 在上面的代码中,`onFileAdded` 和 `onFileSuccess` 是文件添加和上传成功的事件处理程序。`upload` 方法用于手动触发上传。 现在,当你点击 "手动上传" 按钮时,将会触发上传操作。你可以根据需要在事件处理程序中执行其他操作。注意,你可能需要根据你的实际需求进行更多的配置和处理。 希望这个回答能够帮到你!如有任何疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值