Spring注解开发快速入门回顾
一、Spring中的常用注解
@Component:使用在类上用于实例化Bean
@Controller:使用在web层类上用于实例化Bean(作用于@Component一致)
@Service:使用在service层类上用于实例化Bean(作用于@Component一致)
@Repository:使用在dao层类上用于实例化Bean(作用于@Component一致)
@Autowired:使用在字段上用于根据类型依赖注入
@Qualifier:结合@Autowired一起使用用于根据名称进行依赖注入
@Resource:相当于@Autowired+@Qualifier,按照名称进行注入
@Value:注入普通属性
@Scope:标注Bean的作用范围
@PostConstruct:使用在方法上标注该方法是Bean的初始化方法
@PreDestroy:使用在方法上标注该方法是Bean的销毁方法
以上的这些注解主要是替代 Bean 标签的配置。但是这些注解还不能全部替代xml配置文件,包括以下几个新注解:
@Configuration:用于指定当前类是一个Spring 配置类,当创建容器时会从该类上加载注解
@ComponentScan:用于指定Spring 在初始化容器时要扫描的包
@Bean:使用在方法上,标注将该方法的返回值存储到Spring 容器中
@PropertySource:用于加载.properties 文件中的配置
@Import:用于导入其他配置类
一、自定义bean扫描与纯注解开发
使用注解进行开发时,需要在核心配置文件中配置组件扫描,作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法。
也就是告诉Spring在这些包下面使用了注解,运行的时候需要扫描
<context:component-scan base-package="包路径"></context:component-scan>
这时候创建容器还是使用
ApplicationContext ctx = new ClasspathXmlApplicationcontext("xml文件名");
1.1 代替 Bean 标签的注解
Bean标签的基本属性
id:Bean实例在Spring容器中的唯一标识;
class:配置Bean的全包名(全限定名);
scope:配置对象的作用范围;
init-method:指定类中的初始化方法名称;
destroy-method:指定类中销毁方法名称。
1.1.1 @Component代替id和class属性
在xml中将一个类交给Spring容器管理的配置是这样的:
//在xml中将一个类交给Spring容器管理的配置
<bean id="userDao" class="com.sys.dao.impl.UserDaoImpl"></bean>
//使用@Component注解后是这样的(直接在对应类上面加上@Component即可)
@Component("userDao")
public class UserDaoImpl implements UserDao {}
注意:
- 对于@Controller、@Service、@Repository三个注解,他们的作用与@Component注解是一致的,只是一个语义化的表达,体现出我们的三层架构(即@Controller对应controller层的类、@Service对应service层的类、@Repository对应dao层的类)
- 如果注释没有命名,方法遵循驼峰命名法,则容器名称默认首字母小写的方法名,如果不遵循驼峰命名法,则容器名同方法名一致
1.2 实现纯注解开发
- Spring3.0开启了纯注解开发模式,使用Java类代替配置文件。
- 读取Spring核心配置文件初始化容器对象切换为读取Java配置类初始化容器对象
//加载配置文件初始化容器
ApplicationContext ctx = new ClasspathXmlApplicationcontext("xml文件名")
//加载配置类初始化容器
ApplicatinoContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
1.2.1 @Configuration
@Configuration注解,表明该类是一个Spring的核心配置文件,以代替applicationContext.xml。
@Configuration //标志该类为Spring的核心配置类
public class SpringConfig {
}
1.2.2 @ComponentScan
@ComponentScan代替context:component-scan配置包扫描
//xml中配置包扫描
<context:component-scan base-package="com.wang"></context:component-scan>
//配置类中配置包扫描
@Configuration //标志该类为Spring的核心配置类
@ComponentScan("com.sys")
public class SpringConfig {
}
二、Bean管理
2.1 @Scope
@Scope注解代替scope属性标注Bean的范围
//xml中配置包扫描
<bean id="userDao" class="com.sys.dao.impl.UserDaoImpl" scope="prototype"></bean>
//配置类中配置包扫描
@Component("userDao")
@Scope("prototype")
public class UserDaoImpl implements UserDao {}
2.2@PostConstruct、@PreDestroy
@PostConstruct、@PreDestroy注解代替init-method、destroy-method属性配置
//xml中配置包扫描
<bean id="user" class="com.wang.pojo.User" init-method="start" destroy-method="end"></bean>
//配置类中配置包扫描
@PostConstruct
public void start(){
System.out.println("初始化方法");
}
@PreDestroy
public void end(){
System.out.println("销毁方法");
}
三、依赖注入
3.1 @Value代替property普通属性注入
//xml中配置包扫描
<bean id="user" class="com.sys.pojo.User">
<property name="username" value="test"/>
<property name="password" value="testPassword"/>
</bean>
//配置类中配置包扫描
@Component("user")
public class User {
private Integer id;
@Value("test")
private String username;
@Value("testPassword")
private String password;
}
3.2 @Autowired自动装配
@Autowired、@Qualifier、@Resource代替字标签 property的依赖注入
@Resource注解相当于@Autowired+@Qualifier注解,按照名称进行注入。
//xml中配置包扫描
<bean id="userService" class="com.sys.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
//配置类中配置包扫描
@Component("user")
public class User {
@Autowired
@Qualifier("userDao")
private UserDao userDao;
}
3.2.1 小结
-
@Autowired
@Autowired是按类型自动转配的,不支持id匹配。
需要导入 spring-aop的包!
@Autowired(required=false) 说明:false,对象可以为null;true,对象必须存对象,不能为null。如果允许对象为null,设置required = false,默认为true -
@Qualifier
@Autowired是根据类型自动装配的,加上@Qualifier则可以根据byName的方式自动装配
@Qualifier不能单独使用。 -
@Resource
@Resource如有指定的name属性,先按该属性进行byName方式查找装配;
其次再进行默认的byName方式进行装配;
如果以上都不成功,则按byType的方式自动装配。
都不成功,则报异常。
3.2.2 @Autowired与@Resource异同
1、@Autowired与@Resource都可以用来装配bean。都可以写在字段上,或写在setter方法上。
2、@Autowired默认按类型装配(属于spring规范),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用
3、@Resource(属于J2EE复返),默认按照名称进行装配,名称可以通过name属性进行指定。如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
它们的作用相同都是用注解方式注入对象,但执行顺序不同。@Autowired先byType,@Resource先byName。
3.3 @PropertySource
@PropertySource代替context:property-placeholder加载外部properties配置文件
//xml中配置包扫描
<context:property-placeholder location="jdbc.properties"/>
//配置类中配置包扫描
@Configuration //标志该类为Spring的核心配置类
@ComponentScan("com.sys")
PropertySource("jdbc.properties")
public class SpringConfig {
}
四、管理第三方Bean
4.1 @Bean代替非自定义的Bean的配置
xml中配置数据源如下:
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
配置文件中配置数据源:
@Configuration //标志该类为Spring的核心配置类
@ComponentScan("com.sys")
@Import(SpirngConfig.class) //导入合并其他配置类,类似于配置文件中的 inculde 标签
public class SpringConfig {
@Bean("dataSource")
public DataSource getDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai");
dataSource.setUsername("root");
dataSource.setPassword("123456");
return dataSource;
}
}
五、 典型案例
5.1 整合mybatis
- Mybatis核心对象分析
- 回顾看一下mybatis核心配置文件组成:
- 需要SqlSessionFactory交给容器管理(SqlSessionFactory需要第三方bean中的mybatis通过dataSource连接池来获得)
- 导入相关pom依赖spring-jdbc、mybatis、mybatis-spring、druid、mysql-connector-java
- 创建JdbcConfig配置类,利用@Value注入dataSource相关值,利用@Bean来管理创建DataSource
- 创建MybatisConfig配置类,利用@Bean来管理创建sqlSessionFactoryBean(方法参数直接写dataSource,容器会自动寻找注入使用)