spring全注解

在之前的内容中学习了spring中的一些注解,@Component、@Repository、@Service、@Controller,@Autowired等等,但是在使用这些注解的时候需要首先在spring的配置文件中添加扫描器才可以:

<context:component-scan base-package="com.monkey1024"/>

之前是使用的注解+xml配置文件的方式,那如何完全抛弃xml配置文件,全部使用注解来完成呢,这里spring提供了一些其他注解,可以帮助开发者完全抛弃xml配置文件。

@Configuration

该注解的作用是指定当前类是一个spring配置类,可以把这个配置类看作是之前的xml配置文件 当创建容器时会加载该类上的注解。 例如:

@Configuration
public class MyConfiguration {
}

因为使用了注解的方式,所以在获取容器时需要使用
AnnotationApplicationContext(MyConfiguration.class)。这里的MyConfiguration类是带有@Configuration注解的类。

    //通过注解创建容器对象
    ApplicationContext context = new AnnotationConfigApplicationContext(MyConfiguration.class);

@ComponentScan

该注解的作用是扫描文件,相当于是之前xml配置文件中的:

<context:component-scan base-package="com.monkey1024"/>

在spring的配置类上添加该注解来实现扫描文件,例如

@Configuration
@ComponentScan("com.monkey1024")
public class MyConfiguration {
}

spring全注解的测试

创建dao层接口:

public interface StudentDao {
    void study();
}

dao层实现类:

import com.monkey1024.dao.StudentDao;
import org.springframework.stereotype.Repository;

@Repository
public class StudentDaoImpl implements StudentDao {
    @Override
    public void study() {
        System.out.println("学习改变未来");
    }
}

创建service层接口:

public interface StudentService {
    void study();
}

创建service层实现类:

@Service
public class StudentServiceImpl implements StudentService {

    @Autowired
    private StudentDao studentDao;

    @Override
    public void study() {
        studentDao.study();
    }
}

创建测试方法,注意getBean里面写的是实现类的名字,首字母小写:

//通过注解创建容器对象
ApplicationContext context = new AnnotationConfigApplicationContext(MyConfiguration.class);
//从容器中获取studentServiceImpl对象,注意这里是实现类的名字
StudentService studentService = (StudentService)context.getBean("studentServiceImpl");
studentService.study();

@PropertySource和@Value

@PropertySource用于加载.properties文件中的配置,比如使用jdbc的时候会从配置文件中读取内容。

@Value用于指定获取配置文件中的内容。例如

创建db.properties配置文件,这里的username前面最好加个别的内容,否则会获取你当前电脑的名字:

driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
jdbc.username=root
password=111111

创建类来读取配置文件中的内容

/*
    jdbc操作数据库工具类
 */
@PropertySource("db.properties")
public class MyConnection {

    @Value("${driverClass}")
    private String driverClass;
    @Value("${url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${password}")
    private String password;
}

@Bean

该注解只能写在方法上,spring会调用该方法并将返回的对象放到容器中。

上面的MyConnection类读取了配置文件中的内容,此时我们来创建一个Connection对象,并将该对象放入到spring的容器中。

/*
    jdbc操作数据库工具类
 */
@PropertySource("db.properties")
public class ConnectionConfiguration {

    @Value("${driverClass}")
    private String driverClass;
    @Value("${url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${password}")
    private String password;

    /*
        这里的name是对象放入容器中的名字,相当于之前配置文件中bean的id
     */
    @Bean(name = "myConnection")
    public Connection getConnection() throws Exception {
        Class.forName(driverClass);
        return DriverManager.getConnection(url, username, password);
    }

}

因为要获取mysql数据库的链接对象,所以需要添加mysql驱动依赖

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>

@Import

用于导入其他配置类,在引入其他配置类时,被进入的配置类可以不用再写@Configuration注解(写上也行)。

上面已经把ConnectionConfiguration相关配置都搞定了,本身该类也是一个配置类,为了方便操作,这里我们将该类添加到之前编写的配置类中。

@Configuration
@ComponentScan("com.monkey1024")
@Import({ConnectionConfiguration.class})//这里可以添加多个配置类
public class MyConfiguration {
}

最后测试

在创建容器对象的时候,spring会让ConnectionConfiguration读取db.properties配置文件中的信息,并且调用getConnection方法将创建出来的bean对象放到spring容器中。

    //通过注解创建容器对象
    ApplicationContext context = new AnnotationConfigApplicationContext(MyConfiguration.class);
    //从容器中获取Connection对象
    Connection myConnection = (Connection)context.getBean("myConnection");
    System.out.println(myConnection.getClass());