1.注解创建对象
步骤:
A. 在配置文件中,引入context命名空间
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring- beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
2.<context:component-scan base-package="com.hh"/>
扫描
@Component、@Service、@Controller、@Repository注解的类,并把这些类纳入进spring容器
中管理。它的作用和在xml文件中使用bean节点配置组件是一样的。要使用自动扫描机制,我们需
要打开以下配置信息:
1、引入context命名空间 需要在xml配置文件中配置以下信息:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:component-scan base-package="com.hh"/>
</beans>
2、在配置文件中添加context:component-scan标签
<context:component-scan base-package="com.hh"/>
其中base-package为需要扫描的包(含子包)。
注:
1、在使用组件扫描元素时,AutowiredAnnotationBeanPostProcessor 和
CommonAnnotationBeanPostProcessor会隐式地被包括进来。 也就是说,连个组件都会被自动检
测并织入 - 所有这一切都不需要在XML中提供任何bean配置元数据。
2、功能介绍
@Service用于标注业务层组件、
@Controller用于标注控制层组件(如struts中的action)、
@Repository用于标注数据访问组件,即DAO组件。
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
3.注解注入属性
如果注解不创建对象
在配置文件中加入context:annotation-config标签
<context:annotation-config/>
这个配置隐式注册了多个对注释进行解析处理的处理器
AutowiredAnnotationBeanPostProcessor,
CommonAnnotationBeanPostProcessor,
PersistenceAnnotationBeanPostProcessor,
RequiredAnnotationBeanPostProcessor
注:
@Resource
@Autowired
这两个注解的区别是:
@Autowired 默认按类型装配,
@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。
@Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值
可以设置它required属性为false。
@Qualifier
如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。
@Autowired
@Qualifier
@Resource
1、@Resource注解和@Autowired一样,也可以标注在字段或属性的setter方法上.
• 当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象
• 当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。
2、@Resource注解默认按名称装配。
名称可以通过@Resource的name属性指定,如果没有指定name属性,
•注意:如果没有指定name属性,并且按照默认的名称找不到依赖对象时,
@Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。
@PostConstruct
指定Bean的初始化方法
@PreDestroy
指定Bean的销毁方法
注解的过程
* 1、启动spring容器
* 2、把spring配置文件中的bean实例化(person,student)
* 3、当spring容器解析配置文件
* <context:annotation-config></context:annotation-config>
* spring容器会在纳入spring管理的bean的范围内查找哪些类的属性上是否加有@Resource注解
* 4、如果在属性上找到@Resource注解
* 如果@Resource的注解的name属性的值为""
* 则把@Resource所在的属性的名称和spring容器中的id作匹配
* 如果匹配成功,则赋值
* 如果匹配不成功,则会按照类型进行匹配
* 如果匹配成功,则赋值,匹配不成功,报错
* 如果@Resource的注解的name属性的值不为""
* 则解析@Resource注解name属性的值,把值和spring容器中的ID进行匹配
* 如果匹配成功,则赋值
* 如果匹配不成功,则报错
自定义注解
@Target(ElementType.TYPE)//该注解能够作用在类上
@Retention(RetentionPolicy.RUNTIME)
public @interface ClassInfo {
String name() default "";
}
@Target(ElementType.METHOD)//该注解能够作用于方法上
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodInfo {
String name() default "";
}
@ClassInfo(name="我")
public class ItheimaCloud11 {
@MethodInfo(name="你")
public void java(){
}
}
注解解析器
public class AnnotationParse {
public static void parse(){
Class class1 = ItheimaCloud11.class;
//判断该类上面是否有ClassInfo注解
if(class1.isAnnotationPresent(ClassInfo.class)){
ClassInfo classInfo = (ClassInfo)class1.getAnnotation(ClassInfo.class);
System.out.println(classInfo.name());
}
Method[] methods = class1.getMethods();
for (Method method : methods) {
//判断当前正在遍历的方法上面是否存在MethodInfo注解
if(method.isAnnotationPresent(MethodInfo.class)){
MethodInfo methodInfo = method.getAnnotation(MethodInfo.class);
System.out.println(methodInfo.name());
}
}
}
@Test
public void test(){
AnnotationParse.parse();
}