初识注解
本节我们来使用以下注解!
通过给bean(实体类)加上某些注解,快速的将bean加入到IOC容器中!
注解分类
目前注解大致分为:
- @Service:业务逻辑层加该注解
- @Controller:给控制器层加该注解
- @Component:其他自定义的杂类,使用此注解
- @Repository:给数据库层(Dao、数据持久层),添加该注解
某个类上添加任何一个注解,都能将该类加入到IOC容器中,Spring底层并不会去验证你加的注解是否符合,
但是我们推荐该加什么加什么!原因如下:
1、方便团队开发,使不同开发人员明白该类的作用是什么。
2、虽然都能将类交给Spring管理,并且暂时没区别!但万一Spring对某一个注解做了特殊处理(优化等),乱加的话,可能会导致以后的代码维护困难!
使用注解步骤
- 给需要添加的组件(类)标上上面四个之一的注解。
- 告诉Spring那自动扫描“有注解的类”所存在的包(到applicationContext.xml配置,用到context命名空间)
具体
步骤1:新建包
我们这里新建了如下的包用作测试:
- com.misiai.bean
- com.misiai.dao
- com.misiai.controller
- com.misiai.service
步骤2:修改配置文件
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<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.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!--扫描包-->
<context:component-scan base-package="com.misiai"/>
<!--com.misiai包下包括:bean、controller包,所以我们具体到com.misiai即可-->
</beans>
步骤3:dao包下,新建BookDao.java类
package com.misiai.dao;
import org.springframework.stereotype.Repository;
@Repository
public class BookDao {
public BookDao() {
System.out.println("BookDao 的无参构造!");
}
}
步骤4:test包下,新建测试类
package com.misiai.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test01 {
ApplicationContext ap = new ClassPathXmlApplicationContext("applicationContext.xml");
@Test
public void test01() {
}
}
结果:
问题:我们这里还未获取该BookDao类,只是容器把它创建了。
根据以前章节可知,如果是配置在xml文件里,我们可以写id,然后通过getBean方法获取该类,那么现在如何获得该类呢?类名首字母小写!
如下:
@Test
public void test01() {
BookDao bookDao = ap.getBean("bookDao", BookDao.class);
System.out.println("bookDao = " + bookDao);
}
自定义ID
如上,默认id是使用类明的首字母小写构成,那么可以自定义么?肯定可以的!
只需加注解时,给个参数,如下:Misiai
@Repository("Misiai")
public class BookDao {
public BookDao() {
System.out.println("BookDao 的无参构造!");
}
}
然后我们顺带测试注解下,是否默认是单例的:
@Test
public void test01() {
BookDao bookDao = ap.getBean("Misiai", BookDao.class);
BookDao bookDao2 = ap.getBean("Misiai", BookDao.class);
System.out.println(bookDao == bookDao2);
}
结果:是默认是单实例的!
多实例
那么问题又来了,如何改成多实例?加@Scope(value="prototype")
注解
@Repository("Misiai")
@Scope(value = "prototype")
public class BookDao {
public BookDao() {
System.out.println("BookDao 的无参构造!");
}
}
为什么要学xml配置
既然注解这么方便,那为什么前面大篇幅的学习基于xml的配置?
很简单啊,我们自己写的类肯定能加注解,但是别人写的呢?
比如前面使用的数据库连接池,那可不能使用注解!
所以,开发中,一般都是两者结合来用!
细节
要使Spring支持注解,需要满足几个条件:
1、给类上加上注解注解。
2、在xml配置文件里配置。
3、导入aop Jar包。
以上三个条件任意缺失一个都肯能导致报错,或达不到预期!