【Spring笔记】四、Spring使用注解开发


Spring注解开发

1、Spring原始注解

Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,因此注解开发是一种趋势,注解可以代替xml配置文件,简化配置操作,提高开发效率

注意:使用注解开发时,需要在applicationContext.xml中配置组件扫描,作用是指定某个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法

<!--配置组件扫描-->
<context:component-scan base-package="com.heima"></context:component-scan>

Spring原始注解主要替代< Bean >的配置

代码示例:

项目结构

  1. UserDaoImpl
@Component("userDao")
public class UserDaoImpl implements UserDao {
    @Override
    public void save() {
        System.out.println("UserDaoImpl save() running...");
    }
}
  • @Component(“userDao”):相当于在xml中配置了< bean id=“userDao” class=“com.heima.dao.impl.UserDaoImpl”/>
    • 可以用**@Repository(“userDao”)**替换,代表Dao层,增强可读性

2.UserServiceImpl

@Component("userService")
public class UserServiceImpl implements UserService {     
//    @Autowired
//    @Qualifier("userDao")
    @Resource(name = "userDao")
    private UserDao userDao;

//    public void setUserDao(UserDao userDao) {
//        this.userDao = userDao;
//  }

    @Override
    public void save() {
        userDao.save();
    }
}
  • @Component(“userService”):相当于在xml中配置了< bean id=“userService” class=“com.heima.service.impl.UserServiceImpl”>
    • 可以用**@Repository(“userService”)**替换,代表Service层,增强可读性
  • @Autowired:按照数据类型从Spring容器中查找匹配的bean
  • @Autowired+@Qualifier(“userDao”):按照id值从Spring容器中进行匹配的bean
    • 相当于在xml中的userService的bean标签下配置了
    • @Qualifier(),是按照id值从Spring容器中进行匹配的bean,需要与@Autowired结合使用
  • @Resource(name=“userDao”):相当于@Autowired + @Qualifier(“userDao”)
  • 由于加了依赖注解,可以省去setUserDao方法

注入普通属性

@Service("userService")
public class UserServiceImpl implements UserService {

    @Value("${jdbc.driver}")
    private String driver;

由于xml文件已经加载了jdbc.properties,所以里面的键值对jdbc.driver=xxxxx已经加载到了xml中,使用**@Value("")**搭配SpEL表达式即可抽取jdbc配置文件中的数据用做初始化

标注Bean作用范围

@Scope()可以配置对象作用的范围,如singleton单例,prototype多例

@Service("userService")
//@Scope("prototype")
@Scope("singleton")
public class UserServiceImpl implements UserService {

配置Bean初始化、销毁方法

  • @PostConstruct,指明该方法在对象创建后调用
  • @PreDestroy,指明该方法在对象销毁前调用
@PostConstruct
public void init(){
    System.out.println("对象初始化方法");
}
@PreDestroy
public void destroy(){
    System.out.println("对象销毁方法");
}

2、Spring新注解

使用之前的原始注解不能全部替代xml配置文件,还需要使用注解替代的配置有:

  • 非自定义的Bean的配置:< bean>
  • 加载properties文件的配置:<context:property-placeholder location=“classpath:”/>
  • 组件扫描的配置:< context:component-scan base-package=""/>
  • 引入其他文件:< import resource=“classpath:”/>

可以使用新注解代替xml配置文件的所有内容

核心配置类

核心配置类SpringConfiguration

package com.heima.config;


@Configuration
//标志该类是Spring的核心配置类
@ComponentScan("com.heima")
//扫描包,相当于<context:component-scan base-package="com.heima"/>
@Import({ DataSourceConfigration.class })
//引入其他子配置类,参数为数组,可以引入多个
public class SpringConfiguration {

}

其他子配置类

数据库连接池配置类DataSourceConfigration

package com.heima.config;

@PropertySource("classpath:jdbc.properties")
//引入properties配置文件,相当于 <context:property-placeholder location="classpath:jdbc.properties"/>
public class DataSourceConfigration {
//    由于已引入jdbc.properties配置文件,所以可以用@Value+SpEL表达式注入普通属性,然后赋值给连接池对象
    @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("dataSource")  
    //Spring会将当前方法的返回值以指定id名称存储到Spring容器当中
    public DataSource getDataSource(){
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }

}

使用带注解的配置类,摒弃applicationContext.xml配置文件后,获取Spring容器即ApplicationContext,就需要如下方法了

ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class);

3、Spring继承Junit

原有问题

在测试类中,每个测试方法都需要获取Spring容器对象

AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class);
UserService userService = app.getBean(UserService.class);

解决方法

  • 让SpringJunit负责创建Spring容器,需要传入配置文件名
  • 将需要进行测试的Bean直接在测试类中进行注入

实现步骤

  1. 导入Spring、Junit、Spring集成Junit的jar包依赖
  2. 使用@Runwith注解替换原来的运行期
  3. 使用@ContextConfiguration指定配置文件或配置类
  4. 使用@Autowired注入需要测试的对象
  5. 创建测试方法进行测试

1、导入Spring、Junit、Spring集成Junit的jar包依赖

pom.xml

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.0.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>5.0.5.RELEASE</version>
</dependency>
//2、使用@Runwith注解替换原来的运行期
@RunWith(SpringJUnit4ClassRunner.class)

//3、使用@ContextConfiguration指定配置文件或配置类
// 配置文件
//@ContextConfiguration("classpth:applicationContext.xml") 
//配置类
@ContextConfiguration(classes = {SpringConfiguration.class})


public class SpringJunitTest {
    
//4、使用@Autowired注入需要测试的对象    
    @Autowired
    private UserService userService;
    @Autowired
    private DataSource dataSource;
    
//5、创建测试方法进行测试    
    @Test
    public void test() throws Exception{
        userService.save();
        System.out.println(dataSource.getConnection());
    }
}

如需更多知识点请前往我的Spring学习笔记专栏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值