Spring注解开发

Spring注解开发

一、Spring注解概论

Spring是一个轻代码而重配置的框架,配置起来比较繁重,极大程度上影响开发效率,所以在很多情况下,注解配置比XML配置更加欢迎,Spring2.5引入了很多注解类,因此可以使用注解完成大部分的XML配置


二、Spring原始注解

1、引用数据

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的销毁方法

在这里插入图片描述

在表格中,前四个注解属于一类

在不清楚是属于哪一层的时候,可以用@Component,清楚是哪一层的话就使用对应的注解,这样可读性更好

public class test01 {
    @Test
    public void test1(){
        ApplicationContext app = new ClassPathXmlApplicationContext("applicatonContext.xml");
        UserServiceImpl userService = (UserServiceImpl) app.getBean("userService");
        userService.save();
    }
}
//Repository(dao层)相当于下面的xml配置
//<bean id="userDao" class="com.kang.dao.impl.UserImpl"></bean>
//相当于ID
@Repository("userDao")
public class UserImpl implements UserDao {
    @Override
    public void save() {
        System.out.println("save running 。。	。。。");
    }
}
/**
 *     <bean id="userService" class="com.kang.service.impl.UserServiceImpl">
 *         <property name="userDao" ref="userDao"></property>
 *     </bean>
 */

//相当于<bean id="userService" class="com.kang.service.impl.UserServiceImpl">
//相当于ID
@Service("userService")
public class UserServiceImpl implements UserService {
    //相当于<property name="userDao" ref="userDao"></property>
    //@Autowired  //按照数据类型从spring容器中进行配置,倘如只有一个这种数据类型,那么则不需要写下面的注解
    //@Qualifier("userDao")   //根据id值从容器中进行匹配,但是主要此处@Qualifier和@Autowired一起使用
    @Resource(name = "userDao")   //@Resource相当于@Qualifier+@Autowired
    private UserDao userDao;

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

    public void save(){
        userDao.save();
    }
}

注意:

使用注解开发的时候,需要在applicationContext.xml文件中配置组件扫描(否则会报错)

其作用是指定哪个包以及子包下的Bean需要进行扫描以便标识使用注释配置类、字段和方法

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

2、普通数据

普通数据例如int、String的数据的注入可以使用@Value进行注入

/**
 *     <bean id="userService" class="com.kang.service.impl.UserServiceImpl">
 *         <property name="userDao" ref="userDao"></property>
 *     </bean>
 */

//相当于<bean id="userService" class="com.kang.service.impl.UserServiceImpl">
//相当于ID
@Service("userService")
public class UserServiceImpl implements UserService {
    //相当于<property name="userDao" ref="userDao"></property>
    //@Autowired  //按照数据类型从spring容器中进行配置,倘如只有一个这种数据类型,那么则不需要写下面的注解
    //@Qualifier("userDao")   //根据id值从容器中进行匹配,但是主要此处@Qualifier和@Autowired一起使用
    @Resource(name = "userDao")   //@Resource相当于@Qualifier+@Autowired
    private UserDao userDao;

    //普通数据的注入
    @Value("www.baidu.com")
    private String url;

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

    public void save(){
        userDao.save();
        System.out.println(url);
    }
}

但是像这种用法一般很少,通过是在使用EL表达式,这样可以解耦,不至于在代码中写死了某一个字符串,便于系统的维护

若要使用EL表达式,首先先在xml文件中加载properties文件,接着@Value结合EL表达式

@Value"${key}"
/**
 *     <bean id="userService" class="com.kang.service.impl.UserServiceImpl">
 *         <property name="userDao" ref="userDao"></property>
 *     </bean>
 */

//相当于<bean id="userService" class="com.kang.service.impl.UserServiceImpl">
//相当于ID
@Service("userService")
public class UserServiceImpl implements UserService {
    //相当于<property name="userDao" ref="userDao"></property>
    //@Autowired  //按照数据类型从spring容器中进行配置,倘如只有一个这种数据类型,那么则不需要写下面的注解
    //@Qualifier("userDao")   //根据id值从容器中进行匹配,但是主要此处@Qualifier和@Autowired一起使用
    @Resource(name = "userDao")   //@Resource相当于@Qualifier+@Autowired
    private UserDao userDao;

    //普通数据的注入(结合EL表达式)
    @Value("${jdbc.url}")
    private String url;

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

    public void save(){
        userDao.save();
        System.out.println(url);
    }
}

3、标注初始化以及销毁方法

@Service("userService")
public class UserServiceImpl implements UserService {
    //相当于<property name="userDao" ref="userDao"></property>
    //@Autowired  //按照数据类型从spring容器中进行配置,倘如只有一个这种数据类型,那么则不需要写下面的注解
    //@Qualifier("userDao")   //根据id值从容器中进行匹配,但是主要此处@Qualifier和@Autowired一起使用
    @Resource(name = "userDao")   //@Resource相当于@Qualifier+@Autowired
    private UserDao userDao;

    //普通数据的注入
    @Value("${jdbc.url}")
    private String url;

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

    public void save(){
        userDao.save();
        System.out.println(url);
    }

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

三、 Spring新注解

Spring原始注解不能替代全部的xml配置文件,还需要使用spring新注解来解决以下的配置:

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

1、新注解使用方法

  • 创建一个springConfiguration类,使用@Configuration表示,标明这个类是一个Spring配置类
  • 不建议将所有配置都写在一个主配置文件,所以还可以用import
@Configuration //标注为主配置文件
@ComponentScan("com.kang") //扫描
@Import(DataSourceConfiguration.class) //导入外部配置文件
public class SpringConfiguration {
}
@PropertySource("jdbc.properties") //导入properties配置文件
public class DataSourceConfiguration {

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

    @Bean(name = "dataSource") //标注将该方法的返回值存储到 Spring 容器中
    public DataSource getDataSource() throws Exception {
        //创建数据源
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        //设置数据库连接参数
        dataSource.setDriverClass(driver);
        dataSource.setJdbcUrl(url);
        dataSource.setUser(user);
        dataSource.setPassword(password);
        return dataSource;
    }
}
    @Test
    public void test2() throws SQLException {
        ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class);
        UserServiceImpl userService = (UserServiceImpl) app.getBean("userService");
        userService.save();
        DataSource dataSource = (DataSource) app.getBean("dataSource");
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
    }

rviceImpl userService = (UserServiceImpl) app.getBean(“userService”);
userService.save();
DataSource dataSource = (DataSource) app.getBean(“dataSource”);
Connection connection = dataSource.getConnection();
System.out.println(connection);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

起名方面没有灵感

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值