主要包括四类:@Component、@Repository @Service、@Controller
说明:
@Controller 控制层,就是我们的action层
@Service 业务逻辑层,就是我们的service或者manager层
@Repository 持久层,就是我们常说的DAO层
@Component (字面意思就是组件),它在你确定不了事哪一个层的时候使用。
其实,这四个注解的效果都是一样的,Spring都会把它们当做需要注入的Bean加载在上下文中;但是在项目中,却建议你严格按照除Componen的其余三个注解的含义使用在项目中。这对分层结构的web架构很有好处。
示例:
1. 控制层
@Controller // 注释为controller
@Scope("prototype")
public class LoginAction {
@Autowired
@Qualifier("userService") //注释指定注入 Bean
private IUserService userService;
@RequestMapping(value = "/login/{username}", method = RequestMethod.GET)
public ModelAndView myMethod(HttpServletRequest request, HttpServletResponse response,
@PathVariable("username") String username, ModelMap modelMap) throws Exception {
modelMap.put("loginuser", username);
return new ModelAndView("/login", modelMap);
}
@RequestMapping(value = "/welcome", method = RequestMethod.GET)
public String registPost(User user) {
return "/welcome";
}
}
参数:
userName=xxx&password=yyy
----------------
class User{
private String userName;
private String password;
}
(1)LoginAction使用了@Scope注解,@Scope("prototype")表示将Action的范围声明为原型,可以利用容器的scope="prototype"来保证每一个请求有一个单独的Action来处理,避免struts中Action的线程安全问题。spring 默认scope 是单例模式(scope="singleton"),这样只会创建一个Action对象,每次访问都是同一Action对象,数据不安全,struts2 是要求每次次访问都对应不同的Action,scope="prototype" 可以保证当有请求的时候都创建一个Action对象。
(2)@PathVariable("user") String user是url中变量的获取。
(3)常用注解@Controller、@RequestMapping、@RequestParam、@PathVariable、@CookieValue
(4)常见的参数类型
1).HttpServletRequest、HttpServletResponse或HttpSession。
2).添加了@RequestParam注解的任意类型的请求参数
3).添加了@ModelAttribute注解的任意类型的模型属性
4).任意类型的命令对象,供Spring绑定请求参数
5).Map或者ModelMap,供处理程序方法向模型添加属性
6).Errors或者BindingResult,让处理程序方法访问命令对象的绑定和验证结果
7).SessionStatus,让处理程序方法发出会话处理已经完成的通知
(5)常见的返回值类型
处理程序方法的返回类型可以是ModelAndView、Model、Map、String、void
2. 业务逻辑层
@Service("userService")
public class UserServiceImpl implements IUserService {
@Autowired
@Qualifier("userDao")
private IUserDao userDao;
...
}
(1)@Autowired暴露的required属性,这是承担着依赖性检查任务的重要属性。默认时,凡是应用了@Autowired注解的属性和方法都必须找到合适的协作者,否则DI容器会抛出异常,通过调整required属性取值能够改变这一行为,当@Autowired注解的required属性设置为false时,即使未找到合适的协作者,异常都始终不会被抛出。
(2)@Autowired注解能够作用于构建器、属性、方法。这里的方法不局限于设值方法,即setter方法,常见的各种方法都可以应用这一注解。
3. 持久层
@Repository("userDao")
public class UserDaoImpl implements IUserDao {
private static Logger logger = LoggerFactory.getLogger(UserDaoImpl.class);
private DataSource dataSource;
private JdbcTemplate template;
@Autowired
public UserDaoImpl(DataSource dataSource){
this.dataSource= dataSource;
template = new JdbcTemplate(this.dataSource);
}
4. 持久层
@Component("component")
public class TestCompoment {
@Autowired
private ApplicationContext ctx;
public ApplicationContext getCtx() {
return ctx;
}
}
(1)在类上使用@Component注解,表示该类定义为Spring管理Bean,使用默认value(可选)属性表示Bean标识符。
(2)这是所有受Spring 管理组件的通用形式,@Component注解可以放在类的头上,@Component不推荐使用。