黑马程序员技术交流社区

标题: Spring注解开发 [打印本页]

作者: nullException    时间: 2019-6-5 18:43
标题: Spring注解开发
2. Spring注解开发

2.1 Spring原始注解

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

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

  注解                    说明                              
  @Component            使用在类上用于实例化Bean                  
  @Controller           使用在web层类上用于实例化Bean               
  @Service              使用在service层类上用于实例化Bean           
  @Repository           使用在dao层类上用于实例化Bean               
  @Autowired            使用在字段上用于根据类型依赖注入                 
  @Qualifier            结合@Autowired一起使用用于根据名称进行依赖注入     
  @Resource             相当于@Autowired+@Qualifier,按照名称进行注入
  @Value                注入普通属性                           
  @Scope                标注Bean的作用范围                     
  @PostConstruct        使用在方法上标注该方法是Bean的初始化方法           
  @PreDestroy           使用在方法上标注该方法是Bean的销毁方法            

注意:

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

    <!--注解的组件扫描-->
    <context:component-scan base-package="com.itheima"></context:component-scan>

使用@Compont或@Repository标识UserDaoImpl需要Spring进行实例化。

    //@Component("userDao")
    @Repository("userDao")
    public class UserDaoImpl implements UserDao {
        @Override
        public void save() {
                System.out.println("save running... ...");
        }
    }

使用@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();
        }
    }

使用@Value进行字符串的注入

    @Repository("userDao")
    public class UserDaoImpl implements UserDao {
        @Value("注入普通数据")
        private String str;
        @Value("${jdbc.driver}")
        private String driver;
        @Override
        public void save() {
            System.out.println(str);
            System.out.println(driver);
            System.out.println("save running... ...");
        }
    }

使用@Scope标注Bean的范围

    //@Scope("prototype")
    @Scope("singleton")
    public class UserDaoImpl implements UserDao {
       //此处省略代码
    }

使用@PostConstruct标注初始化方法,使用@PreDestroy标注销毁方法

    @PostConstruct
    public void init(){
            System.out.println("初始化方法....");
    }
    @PreDestroy
    public void destroy(){
            System.out.println("销毁方法.....");
    }

2.2 Spring新注解

使用上面的注解还不能全部替代xml配置文件,还需要使用注解替代的配置如下:

非自定义的Bean的配置:<bean>

加载properties文件的配置:context:property-placeholder

组件扫描的配置:context:component-scan

引入其他文件:<import>

  注解                     说明                                      
  @Configuration         用于指定当前类是一个 Spring   配置类,当创建容器时会从该类上加载注解
  @ComponentScan         用于指定 Spring   在初始化容器时要扫描的包。   作用和在 Spring   的 xml 配置文件中的   <context:component-scan   base-package="com.itheima"/>一样
  @Bean                  使用在方法上,标注将该方法的返回值存储到   Spring   容器中     
  @PropertySource        用于加载.properties   文件中的配置               
  @Import                用于导入其他配置类                              

@Configuration

@ComponentScan

@Import

    @Configuration
    @ComponentScan("com.itheima")
    @Import({DataSourceConfiguration.class})
    public class SpringConfiguration {
    }

@PropertySource

@value

    @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

    @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();
        System.out.println(connection);
        }

3. Spring整合Junit

3.1 原始Junit测试Spring的问题

在测试类中,每个测试方法都有以下两行代码:

     ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
     IAccountService as = ac.getBean("accountService",IAccountService.class);

这两行代码的作用是获取容器,如果不写的话,直接会提示空指针异常。所以又不能轻易删掉。

3.2 上述问题解决思路

让SpringJunit负责创建Spring容器,但是需要将配置文件的名称告诉它

将需要进行测试Bean直接在测试类中进行注入

3.3 Spring集成Junit步骤

①导入spring集成Junit的坐标

②使用@Runwith注解替换原来的运行期

③使用@ContextConfiguration指定配置文件或配置类

④使用@Autowired注入需要测试的对象

⑤创建测试方法进行测试

3.4 Spring集成Junit代码实现

①导入spring集成Junit的坐标

    <!--此处需要注意的是,spring5 及以上版本要求 junit 的版本必须是 4.12 及以上-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>5.0.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>

②使用@Runwith注解替换原来的运行期

    @RunWith(SpringJUnit4ClassRunner.class)
    public class SpringJunitTest {
    }

③使用@ContextConfiguration指定配置文件或配置类

    @RunWith(SpringJUnit4ClassRunner.class)
    //加载spring核心配置文件
    //@ContextConfiguration(value = {"classpath:applicationContext.xml"})
    //加载spring核心配置类
    @ContextConfiguration(classes = {SpringConfiguration.class})
    public class SpringJunitTest {
    }

④使用@Autowired注入需要测试的对象

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = {SpringConfiguration.class})
    public class SpringJunitTest {
        @Autowired
        private UserService userService;
    }

⑤创建测试方法进行测试

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = {SpringConfiguration.class}) public class SpringJunitTest {
        @Autowired
        private UserService userService;
        @Test
        public void testUserService(){
                userService.save();
        }
    }

Spring集成Junit步骤

①导入spring集成Junit的坐标

②使用@Runwith注解替换原来的运行期

③使用@ContextConfiguration指定配置文件或配置类

④使用@Autowired注入需要测试的对象

⑤创建测试方法进行测试





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2