Spring注解开发

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

  • Spring原始注解主要是替代的配置
  • 在这里插入图片描述
Spring注解开发
文章图片

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

2. xml 方式配置实现
userDao
public interface UserDao { public void save(); }

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

userService
public interface UserService { public void save(); }

userServiceImpl
public class UserServiceImpl implements UserService {private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; }@Override public void save() { userDao.save(); } }

applicationContext.xml

UserController
public class UserController { public static void main(String[] args) { ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService = app.getBean(UserService.class); userService.save(); } }

在这里插入图片描述
3. 注解配置方式实现
在 UserDaoImpl 下的注解,@Component("userDao") 来替代 下面 bean 的配置

@Component("userDao")
在这里插入图片描述
Spring注解开发
文章图片

userServiceImpl 下

【Spring注解开发】在这里插入图片描述
Spring注解开发
文章图片

在 applicationContext.xml 下配置组件要扫描的包

测试:
Spring注解开发
文章图片

  • xml配置和注解配置达到相同的效果
  • 使用 @Component 注解不能马上意识到是哪一层,所以Spring衍生了三个注解:@Repository、@Service、@Controller ,效果和@Component效果是一样的,可读性好点。
    Spring注解开发
    文章图片
注意:使用注解方式时,可以省略 set 方法。如:把 userServiceImpl 中的 set 方法删掉,也能成功运行:
Spring注解开发
文章图片

因为把注解放在属性上,直接通过反射为属性赋值,下面的方法也可以使用被赋值的属性了
Spring注解开发
文章图片

  • 但如果使用 xml 配置的时候 set 方法是不能省略的
    把上面的 @Qualifier("userDao") 注释掉,也能成功运行,直接写
  • @Autowired也能注入。因为@Autowired 是按照数据类型从Spring容器中进行匹配的,当Spring扫描到这个注解之后,它会直接从Spring容器当中找一个 userDao 类型的 bean,找到之后直接注入。如果容器中 UserDao 类型有多个bean,就不能这样写了 。
  • 按照类型注入,@Autowired
  • 按照名称注入,@Autowired 和 @Qualifier 要一起使用
    Spring注解开发
    文章图片
  • @Resources 相当于@Autowired 和 @Qualifier
    Spring注解开发
    文章图片
@Value 注入普通数据类型,如:把 hello 注入给 driver
Spring注解开发
文章图片

Spring注解开发
文章图片

Spring注解开发
文章图片

  • 使用@Value进行字符串的注入
    Spring注解开发
    文章图片

    Spring注解开发
    文章图片

    Spring注解开发
    文章图片

    Spring注解开发
    文章图片
  • 使用@Scope标注Bean的范围
    Spring注解开发
    文章图片
  • 使用@PostConstruct标注初始化方法,使用@PreDestroy标注销毁方法
    Spring注解开发
    文章图片

    Spring注解开发
    文章图片
  • 这里没打印销毁的方法原因是:因为容器还没有关闭程序就执行完了,所以造成销毁的方法还没打印出来
  • 手动关闭就可以看到销毁的方法打印了
    Spring注解开发
    文章图片

    Spring注解开发
    文章图片
4. Spring新注解
使用上面的注解还不能全部替代xml配置文件,还需要使用注解替代的配置如下:
  • 非自定义的Bean的配置:
  • 加载properties文件的配置:
  • 组件扫描的配置:
  • 引入其他文件:
    Spring注解开发
    文章图片
  • 下面是实现下使用注解完全替代 xml 文件配置
    Spring注解开发
    文章图片
新建一个核心配置类:SpringConfiguration,相当于总配置
//标志改类是Spring核心配置类 @Configuration // @ComponentScan("com.xdr630") // @Import({DataSourceConfiguration.class}) public class SpringConfiguration {}

@Import({DataSourceConfiguration.class}) 里面的值其实是一个数组,可以加载多个类,如:
@Import({DataSourceConfiguration.class,xxx.class})

新建数据源配置类: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("dataSource") //Spring会将当前方法的返回值以指定名称存到Spring容器当中 public DataSource getDataSource() throws PropertyVetoException { ComboPooledDataSource dataSource = new ComboPooledDataSource(); dataSource.setDriverClass(driver); dataSource.setJdbcUrl(url); dataSource.setUser(username); dataSource.setPassword(password); return dataSource; }} 测试加载核心配置类创建Spring容器 public class UserController { public static void main(String[] args) { //ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml"); ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class); UserService userService = app.getBean(UserService.class); userService.save(); } }

Spring注解开发
文章图片

Spring注解开发
文章图片

原文链接
本文为阿里云原创内容,未经允许不得转载。

    推荐阅读