1、包层的注解:@Controller,@Service,@Repository,@Component
@Controller:写在Controller控制层的类上方
@Service: 写在Service业务层的类上方
@Repository:写在Dao层的类上方,
@Component:泛化的概念,可以作用在任何层次
(1.1)前提:applicationContext.xml中要有
<context:component-scan base-package=”com”> ,表示默认情况下自动扫描指定com包下的所有类(含所有子包),将带有@Component、@Repository、@Service、@Controller标签的类自动注册到spring容器
(1.2)上述注解标识的Bean类,其默认作用域是"singleton",即每次创建的实体bean类互不相干
(1.3)使用:
对标记了 @Required、@Autowired、@Resource、@PersistenceUnit等注解的类对象进行注入。
如:
(1.3.1)@Autowired可用在属性、setter方法或构造函数上方
(1.3.1.1)
@Autowired默认先按byType方式注入,再按byName方式注入。即 spring先找类型为People的bean类/子bean类(People 类上方要指定@Component等注解):
@Autowired
private People peo;
否则若People 类上方没被@Component等任意一个注解,则按byName方式注入,即寻找value值为属性名”peo“的类对peo类变量进行注入,如
@Component(value="peo")
public class PeopleImpl extends People(){...}
(1.3.1.2)使用@Qualifier标签,可以手动指定按照byName方式注入
@Autowired
@Qualifier("peo")
private People people; //PeopleImpl 类上方要指定@Component("peo"),且
//@Component可用其他三个@注解代替
(1.3.2)@Resource可用在属性、setter方法上方,默认按照ByName自动注入,name值为bean类首字母小写(People 类上方要指定@Component等注解,同时包含@Resource注解的类上方也要指定@Component):
@Resource(name="people")
private People peo;
上面@Resource(name="people")指定了name值,则只会按照名称进行装配。
若@Resource无指定name值,则按属性名“peo”查找bean类,bean类上方要指定@Component("peo")等注解;若@Resource写在setter方法上也是默认截取setterPeople()的属性名得到"people",然后按这个属性名查找bean类进行注入,bean类上方要指定@Component("people")等注解;当找不到与属性名想匹配的类时,则直接按照byType进行People类型进行装配;推荐使用@Resource注解,这个注解是属于J2EE的,减少了与Spring的耦合
(1.3.3)@Required只能设置在setter方法上
在xml中用<bean></bean>对People 类进行注解时,People 类下的某个属性的setter方法上方有@Required,则<bean></bean>中必须对该属性值进行注入(即赋值):
public class People {
private Integer age;
private String name;
@Required
public void setAge(Integer age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
}
xml文件:(name属性可注入可不注入,age属性必须注入)
<bean id="p" class="com.entity.People">
<property name="age" value="11"/>
</bean>
2、@Bean注解
(1)@Bean注解标识一个用于配置和初始化的方法,类似于xml文件的<bean><bean/>注解,作用类似于在自定义的ServiceImpl上写@Service注入自己的Impl类
(2)
@Configuration //或@Component,必写
public class AppConfig()
{
@Bean
public People getPeople() //返回类People对应<bean>中小写的people
{
return new People();
}
}
等价于:
<beans>
<bean id="people" class="com.hand.core.People"></bean>
</beans>
(3)@Bean可以自定义name从与而<bean>的id保持一致
@Bean(name="myPeople")
与
<beans>
<bean id="myPeople" class="com.hand.core.People"></bean/>
</beans>
等价
3、Hibernate注解:@NotNull和@NotEmpty和@NotBlank区别
@NotNull:不能为null,但可以为empty,长度可以为0
@NotEmpty:不能为null,而且长度必须大于0
@NotBlank:只能作用在String上,不能为null,而且调用trim()后,长度必须
大于0
4、自定义注解
以下自定义了一个注解@StdWho :
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface StdWho {
}
(1)@Targe
定义注解的作用目标,可取值为:
上面自定义@Target({ElementType.PARAMETER})为作用在函数参数上
(2)
@Retention
参数RetentionPolicy.RUNTIME就说明了:@StdWho注解在程序运行时是可见的
RetentionPolicy的枚举类型还有SOURCE、CLASS分别指定注解对于哪个级别是可见的,但是我们一般都是用RUNTIME,因为这是在程序运行时可以对注解进行读取,从而易于软件的测试
spring常见注解
原文:https://www.cnblogs.com/afei1759/p/11198430.html