Spring注解开发(重点)
本章节我们开始学习Spring的注解,首先明确注解就是对原来XML配置的简化,二者实现的功能是一样的。
Spring常用注解
Spring常用注解主要是替代<bean>
的配置
注意:使spring的注解生效,必须开启注解组件扫描
<?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" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!--开启spring的注解组件扫描--> <context:component-scan base-package="com.alibaba"/> </beans>
IOC 对象创建
* @Component 用于实例化对象,相当于配置文件中的<bean id="" class=""/> 它支持一个属性value,相当于xml中bean的id,如果不写,默认值为类名的首字母小写 * @Controller @Service @Repository 这三个注解的功能跟@Component类似,他们分别标注在不同的层上。 @Controller 标注在表现层的类上 @Service 标注在业务层的类上 @Repository 标注在持久层的类上 推荐使用这三个,当一个类实在不好归属在这三个层上时,再使用@Component
修改UserDaoImpl
package com.alibaba.dao.impl; import com.alibaba.dao.UserDao; import org.springframework.stereotype.Component; import org.springframework.stereotype.Repository; // <bean id="userDao" class="com.alibaba.dao.impl.UserDaoMySQL"></bean> // @Component(value = "userDao") // @Component("userDao") // @Component // value属性省略,默认值类名首字母小写 value="userDaoMySQL" @Repository public class UserDaoMySQL implements UserDao { @Override public void save() { System.out.println("操作MySQL数据库"); } }
修改UserServiceImpl
package com.alibaba.serivce.impl; import com.alibaba.dao.UserDao; import com.alibaba.serivce.UserService; import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; // <bean id="userSerivce" class="com.alibaba.serivce.impl.UserServiceImpl"> // @Component @Service public class UserServiceImpl implements UserService { // 声明dao成员变量 private UserDao userDao; // set方法依赖注入 public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Override public void save() { userDao.save(); } }
DI 注入引用类型
- @Autowired:通过Class类从ioc容器中获得对象实例,相当于 ioc.getBean(Class类型) - @Qualifie:需要跟@Autowired组合使用,相当于 ioc.getBean(id,Class类型) - @Resource:由java提供 @Autowired + @Qualifie
修改UserServiceImpl
// <bean id="userSerivce" class="com.alibaba.serivce.impl.UserServiceImpl"> // @Component @Service public class UserServiceImpl implements UserService { // 声明dao成员变量 // <property name="userDao" ref="userDao"></property> // @Autowired // @Qualifier("userDaoOracle") @Resource(name = "userDaoOracle") private UserDao userDao; @Override public void save() { userDao.save(); } }
Bean生命周期
- @Scope:相当于<bean scope="singleton | prototype"></bean> - @PostConstruct:相当于<bean init-method=""></bean> - @PreDestroy:相当于<bean destroy-method=""></bean>
// <bean id="userSerivce" class="com.alibaba.serivce.impl.UserServiceImpl"> // @Component @Service // @Scope("prototype") // 多例对象 <bean scope="prototype"> public class UserServiceImpl implements UserService { // 声明dao成员变量 // <property name="userDao" ref="userDao"></property> // @Autowired // @Qualifier("userDaoOracle") @Resource(name = "userDaoOracle") private UserDao userDao; @Override public void save() { userDao.save(); } @PostConstruct public void init(){ System.out.println("创建成功了..."); } @PreDestroy public void destroy(){ System.out.println("销毁成功了..."); } }
DI 注入简单类型
- @Value 相当于:<property name="driverClassName" value="aaaaa"></property>
package com.alibaba.config; import lombok.Data; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; // <bean id="myDataSouce" class="com.alibaba.config.MyDataSouce"> @Component @Data public class MyDataSouce { @Value("${jdbc.driver}") private String driverClassName ; // <property name="driverClassName" value="${jdbc.driver}"></property> @Value("${jdbc.url}") private String url; // <property name="url" value="${jdbc.url}"></property> @Value("${jdbc.username}") private String username; // <property name="username" value="${jdbc.username}"></property> @Value("${jdbc.password}") private String password; // <property name="password" value="${jdbc.password}"></property> }
知识小结
xml配置 | 注解配置 | 说明 |
---|---|---|
< bean id="" class="" > | @Component @Controller @Service @Repository | bean的实例化 |
< property name="" ref=""> | @Autowired @Qualifier @Resource | bean的对象属性注入 |
< property name="" value=""> | @Value | bean的简单属性注入 |
< bean scope=""> | @Scope | 控制bean的作用范围 |
< bean init-method="" destroy-method="" /> | @PostConstruct @PreDestroy | bean创建之后和销毁之前调用 |
Spring纯注解
使用上面的注解还不能全部替代xml配置文件,还需要使用注解替代的配置
- @Configuration:相当于applicationContext.xml - @ComponentScan:相当于<context:component-scan base-p