Spring03 第三--spring注解开发
2.Spring注解开发
2.1 Spring原始注解
Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置文件可以简化配置,提高开发效率。
Spring原始注解主要是替代<Bean>的配置
注解说明
@Component 使用在类上用于实例化Bean,【分不清是dao还是service层的时候用】
@Controller使用在web层类上用于实例化Bean
@Service使用在service层类上用于实例化Bean
@Repository使用在dao层类上用于实例化Bean
@Autowired使用在字段上用于根据类型依赖注入
@Qualifier结合@Autowired一起使用用于根据名称进行依赖注入
@Resource相当于@Autowired+@Qualifier,按照名称进行注入
@Value注入普通属性
@Scope标注Bean的作用范围
@PostConstruct使用在方法上标注该方法是Bean的初始化方法init-method
@PreDestroy使用在方法上标注该方法是Bean的销毁方法-destory-method
2.1.1不用注解的配置文件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 http://www.springframework.org/schema/context/spring-context.xsd">
<!--加载外部的properties文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--配置数据源-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--配置Dao-->
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
<!--配置service-->
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
</beans>
2.1.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 http://www.springframework.org/schema/context/spring-context.xsd">
<!--加载外部的properties文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--配置数据源-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
<!--注解的组件扫描-->
<context:component-scan base-package="com.itheima"></context:componentscan>
</beans>
2.2 Spring注解开发
2.2.1 dao 、service的基本注解
第一步: 配置组件扫描
注意:使用注解进行开发时,需要在applicationContext.xml中配置组件扫描,作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法。<!--注解的组件扫描--><context:component-scan base-package="com.itheima"></context:componentscan>
第二步:在dao、service类实现上配置注解
(一)、使用@Compont或@Repository标识UserDaoImpl需要Spring进行实例化。
//@Component("userDao")
@Repository("userDao")
public class UserDaoImpl implements UserDao {
@Override
public void save() {System.out.println("save running... ...");
}
}
说明:@Repository("userDao")注解作用等同于
<bean id=”userDao” class=”…UserDaoImpl”>
(二)、使用@Compont或@Service标识UserServiceImpl需要Spring进行实例化
使用@Autowired或者@Autowired+@Qulifier或者@Resource进行userDao的注入
//@Component("userService")
@Service("userService")
public class UserServiceImpl implements UserService {
/*@Autowired@Qualifier("userDao")*/
@Resource(name="userDao")
private UserDao userDao;
@Override
public void save() {userDao.save();}}
重点说明:
1、通过注解的方式在service注入dao时,setUserDao的方法不用写,通过反射为dao属性赋值。
通过在spring配置文件配置dao注入到service,setUserDao方法必须写。
2、只写@Autowired---根据数据类型从spring容器进行匹配
3、@Autowired@Qualifier("userDao")根据bean的id名称匹配
4、@Service("userService")等同于<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
5、@Resource(name="userDao")作用等同于
<property name=”userDao” ref=”userDao”></property>
2.2.2 dao 、service的基本注解
(一)、使用@Value进行字符串的注入
@Repository("userDao")
public class UserDaoImpl implements UserDao {
@Value("注入普通数据")
private String str;
@Value("${jdbc.driver}")
private String driver;
}
说明:
配置
<context:property-placeholder location="classpath:jdbc.properties"/>
通过在applicationContext.xml 加载项目resource下的jdbc.properties,把jdbc的键值对加载到spring容器。可以通过注解@Value("${key }") 获取到对应的值
(二)使用@Scope标注Bean的范围//@Scope("prototype")@Scope("singleton")public class UserDaoImpl implements UserDao {//此处省略代码}
(三)
使用@PostConstruct标注初始化方法,使用@PreDestroy标注销毁方法
@PostConstruct 等同于在配置文件中的init-method
public void init(){System.out.println("初始化方法....");}
@PreDestroy等同于在配置文件中的destrory-method
public void destroy(){System.out.println("销毁方法.....");}
3 Spring新注解
3.3.1 新注解说明
@Configuration用于指定当前类是一个Spring 配置类,当创建容器时会从该类上加载注解
@ComponentScan用于指定Spring 在初始化容器时要扫描的包。作用和在Spring 的xml 配置文件中的<context:component-scan base-package="com.itheima"/>一样
@Bean使用在方法上,标注将该方法的返回值存储到Spring 容器中
@PropertySource用于加载.properties 文件中的配置@Import用于导入其他配置类
3.3.2用新注解 取代applicationContext.xml
(一)spring总的配置类
//标志该类是spring的核心配置类
@Configuration
//<context:component-scan base-package="com.itheima"/>
@ComponentScan("com.itheima")
//加载DataSourceConfiguration数据源类
@Import({DataSourceConfiguration.class})
public class SpringConfiguration {}
( 二) DataSourceConfiguration数据源类
@PropertySource("classpath:jdbc.properties")
public class DataSourceConfiguration {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean(name="dataSource")
public DataSource getDataSource() throws PropertyVetoException {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass(driver);
dataSource.setJdbcUrl(url);
dataSource.setUser(username);
dataSource.setPassword(password);
return dataSource;
}}
( 三)测试加载核心配置类创建Spring容器
@Test
public void testAnnoConfiguration() throws Exception {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfiguration.class);
UserService userService = (UserService) applicationContext.getBean("userService");
userService.save();
DataSource dataSource = (DataSource) applicationContext.getBean("dataSource");
Connection connection = dataSource.getConnection();
}