spring的核心功能是IOC,就是将Bean初始化加入到容器中,怎么将Bean加入容器中,通过注解的方式和配置spring的xml文件
spring注解的方式减少了配置文件的内容,更加便于管理,大大提高了开发效率。
一. 组件类注解
问题:spring怎么知道把哪些java类作为bean注入到spring容器中
答案:通过配置文件 或者 注解的方式标识需要处理的java类
怎么使用注解的方式呢?
-
常用注解介绍
①@Component 标注一个普通的spring bean类
②@Repository 标注dao层
③@Service 标注一个业务逻辑层
④@Controller 标注一个控制器类(前后端的控制器类)
这些注解使用率比较多,是同一类注解,用法相同,功能相同,区别在于扫描的组件类型不同。
@Component能够替代其他三个注解,因为这三个注解被@Component标注的 -
注解实例
-
注意点
①被注解的java类作为bean实例,Bean实例的名称默认实例类的首个字母小写,其他不变。
@Service也可以默认bean的实例名称,但必须是唯一的。
②尽量使用对应组件的注解替代@Companent注解,方便管理
③指定了某些类可以作为spring bean类使用之后,最好还再指定一下spring搜索的路径
比如:
自动扫描指定包及其子包下的所有bean类
<context:component-scan base-package=“com.market.*”/>
二. 装配bean时常用注解
注解说明
-
@Autowired属于Spring的org.springframework.beans.factory.annotation包下,可以用于为 类的属性,构造器,方法进行注值。
注意点:
① 当Spring发现@Autowired注解时,将自动在代码上下文中找到和其匹配(默认是类型byType匹配,也可以设定为byName) 的Bean,并自动注入到相应的地方去。
② 如果@Autowired注解的属性在Spring的xml文件中没有找到指定的bean,会报出异常,因为是null的bean
解决方法:
@Autowired(required = false)
设置这个属性为false
③ 如果@Autowired注解的属性是一个接口,这个接口有多个实现类那么spring不知道到底要使用哪个类,怎么办?
解决方法:
@Autowired
@Qualifier(“BMW”)
private Car car;
再添加一个注解,括号里边的是接口实现类的类名。 -
@Resource不属于spring注解,而是来自于JSR-250位于java.annotation包下,使用该 annotation为目标bean指定协作者Bean。
① @Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配
②@Resource有两个中重要的属性:name和type。name属性指定byName,如果没有指定 name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。
需要注意的是,@Resource如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。
public class AnotationExp {
@Resource(name = “HappyClient”)
private HappyClient happyClient;
@Resource(type = HappyPlayAno .class)
private HappyPlayAno happyPlayAno; }
注意点:使用@Resource也要注意添加配置文件到Spring,如果没有配置component-scan
则一定要配置 annotation-config -
@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
三. spring mvc 模块注解
- @Controller :表明该类会作为与前端作交互的控制层组件,通过服务接口定义的提供访问应用程序的一种行为
- ① @RequestMapping : 这个注解用于将url映射到整个处理类或者特定的处理请求的方法。可以只用通配符!
② @RequestMapping 既可以作用在类级别,也可以作用在方法级别。
@RequestMapping(/hello/*)
public void sayHello(){
//请求为 /happy/hello/* 都会进入这个方法!
//例如:/happy/hello/123 /happy/hello/adb //可以通过get/post 请求 }
@RequestMapping(value="/haha",method=RequestMethod.GET)
public void sayHaHa(){ //只能通过get请求 }
③@RequestParam :将请求的参数绑定到方法中的参数上,有required参数,默认情况
下,required=true,也就是改参数必须要传。如果改参数可以传可不传,可以配置
required=false
@RequestMapping("/happy")
public String sayHappy(
@RequestParam(value = "name", required = false) String name,
@RequestParam(value = "age", required = true) String age)
{ //age参数必须传 ,name可传可不传 ... }
④ @PathVariable : 该注解用于方法修饰方法参数,会将修饰的方法参数变为可供使用的uri变量(可用于动态绑定)。
@RequestMapping(value="/happy/{dayid}",method=RequestMethod.GET)
public String findPet(@PathVariable String dayid, Model mode)
{ //使用@PathVariable注解绑定 {dayid} 到String dayid }