Spring-IOC学习笔记-07基于注解开发
Posted Moon&&Dragon
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring-IOC学习笔记-07基于注解开发相关的知识,希望对你有一定的参考价值。
基于注解开发
好处:
摆脱繁琐的xml文件的配置和属性注入
可读性好,声明式的开发风格更符合中小型项目,很适合轻量级的开发
使用注解的前提,需要在配置文件中开启组件扫描
<!-- 需要导入xml头文件 --> <context:component-scan base-package="com.moon"> <!--排除不需要扫描的bean目录或者bean--> <context:exclude-filter type="regex" expression="com.moon.pojo.*"/> </context:component-scan>
9.1 注解的分类
根据 Bean的类型 分类:来标注和管理bean
@Component
: 组件注解,是一个通用注解,意思是交给IOC容器来管理
@Repository
: 一般标注在Dao层/持久层,也是把类交给IOC容器管理
@Service
: 标注在业务层/逻辑层
@Controller
: 在Web环境下标注在控制层/控制器类上根据如何 注入属性 来分类
按照类型
@Autowired
: 由IOC容器按照管理bean的类型去注入
@Inject
: 基于JSR-330(java依赖注入标准的330号文件),也是通过类型去注入,需要额外引入依赖按名称
@Named
: 基于JSR-330(java依赖注入标准的330号文件),一般和Inject配合一起使用,也需要引入依赖
@Qualifier
: 和Autowired配合使用,通过name指定对应的bean
@Resource
: 基于JSR-250,先按照名称注入,如果没有再按照类型注入元数据注解: 辅助容器更好的管理bean
@Primary
: 主要用在根据类型装配的时候,ioc容器存在多个统一类型的Bean造成装配失败,标识当前的类为主要bean,在多个bean冲突的时候,会优先注入该类。@Repository @Primary public class GardenBabyCartoonDao implements CartoonDao{ @Override public void rentCD() { System.out.println("我租到了花园宝宝的盘"); } }
@PostConstruct
: 相当于xml配置文件中的init-method的自定义初始化方法@PostConstruct public void annotationInit(){ System.out.println("猛男爱看的动漫被初始化了"); }
@PreDestroy
: 相当于xml配置文件中的destroy-method的自定义销毁方法@PreDestroy public void annotationDestroy(){ System.out.println("猛男爱看的动漫被销毁了"); }
@Scope
: 设定一个bean的作用域属性,默认的情况下是singlten,标识在类上@Service @Scope("prototype") public class CartoonService {}
读取外部的配置文件
user=root password=123
在spring的配置中添加如下
<!--让IOC容器读取外部文件--> <context:property-placeholder location="classpath:jdbc.properties"/>
使用Value注解去换取配置文件的值
@Value("${user}") private String url; @Value("${password}") private String password;
@Value
: 为类中的属性注入静态数据,如果引用外部的数据,需要使用表达式${}
填写key去获取Value。如果Value中填写正常字符串,则可以注入基本数据类型。@Value("lili") private String name; @Value("23") private int age;
小结:多个同一类型的Bean根据类型装配(Autowired),会报错,那么就需要去指定一个bean去注入,这时候可以通过Qualifier注解去指定名字,或者使用直接使用Resource注解去指定name,也可以通过在Bean组件的类上加Primary注解来标识这个类为主要的类。
9.2 注解标记bean
在需要交给ioc管理的类的上面加管理bean的注解
@Component
public class DependencyA {}
默认的beanName是该类的首字母小写后的类名,在注解中可以输出值,输入的值就是beanName
@Component("A")
public class DependencyA {}
9.3 注解注入
注入的时候,是通过暴力反射,将属性直接赋值,并没有使用set方法,所以不会调用set方法
如果需要强行使用set方法,可以将注解放在set方法上
// 将注解放在set方法上,使用set注入
@Resource(name = "tigaCartoonDao")
public void setCartoonDao(TigaCartoonDao cartoonDao) {
this.cartoonDao = cartoonDao;
}
注入引用属性
// 先通过type注入,如果有多个bean,通过name指定对应的bean
@Autowired
@Qualifier("tigaCartoonDao")
private TigaCartoonDao cartoonDao;
// 和上面的一样,但是需要导入额外的包
@Inject
@Named("tigaCartoonDao")
private TigaCartoonDao cartoonDao;
// 先通过类型注入,然后通过name注入,相当于上面俩个注解的结合,比较强大
// 这个是java的注解
@Resource(name = "tigaCartoonDao")
private TigaCartoonDao cartoonDao;
// 该注解也可以不给name值,直接通过类型注入
@Resource
private TigaCartoonDao cartoonDao;
// 通过属性的名字也可以指定对应的类型
@Resource
private CartoonDao gardenBabyCartoonDao;
// 如果设计的只有一个实现类,就可以通过一个自动注入的注解进行注入
@Autowired
private TigaCartoonDao cartoonDao;
9.4 上下文创建
和配置文件搭配使用的时候,还是使用的ClassPathXmlApplicationContext(),然后在构造器传入配置文件
需要注意的是,该方式,需要在配置文件中开启组件扫描
public class SpringAnnotationTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("config.xml");
// 关闭容器
((ClassPathXmlApplicationContext)context).registerShutdownHook();
}
}
使用注解的上下文,AnnotationConfigApplicationContext(),然后在构造器中传入需要扫描的包
该方式会去什么指定的包,不再需要配置文件
public class SpringAnnotationTest {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext("com.moon.pojo");
String[] beanDefinitionNames = context.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
System.out.println(beanDefinitionName);
}
}
}
和java配置文件搭配使用,还是使用AnnotationConfigApplicationContext(),但是需要传入java配置文件类
在java配置文件中需要通过注解去开启扫描
以上是关于Spring-IOC学习笔记-07基于注解开发的主要内容,如果未能解决你的问题,请参考以下文章
在学习spring-IoC容器装配Bean_基于注解配置方式的时候,碰见的两个异常