栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > Java

Spring-注解开发

Java 更新时间:发布时间: 百科书网 趣学号

Spring学习笔记目录
使用配置数据源的项目继续练习

目录
  • Spring注解开发
    • XML配置方式(回顾)
      • 运行结果
    • 注解开发示例
      • 运行结果
    • 分层注解
      • 运行结果
    • 属性注入注解方式
    • 普通属性注入
      • 运行结果
    • 普通属性注入使用EL表达式
      • 运行结果
      • 代码解析
    • 新增初始化方法与销毁方法
      • 运行结果
  • Spring新注解
    • 新注解示例
    • 运行结果
    • 新注解详解

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

XML配置方式(回顾)

回顾XML配置方式然后与注解开发进行比较,易于理解
项目结构:

新建接口UserDao.java:

package com.stu.dao;


public interface UserDao {
    public void save();
}

新建实现类UserDaoImpl.java:

package com.stu.dao.impl;

import com.stu.dao.UserDao;


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

新建接口UserService.java:

package com.stu.service.dao;


public interface UserService {
    public void save();
}

新建实现类UserServiceImpl.java:

package com.stu.service.dao.impl;

import com.stu.dao.UserDao;
import com.stu.service.dao.UserService;


public class UserServiceImpl implements UserService {
    private UserDao userDao;

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

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

新建类UserController.java:用于测试

package com.stu.web;

import com.stu.service.dao.UserService;
import com.stu.service.dao.impl.UserServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


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

applicationContext.xml新增以下配置:

	
    
        
    
运行结果

运行UserController类文件

测试类中的save方法被成功执行,说明配置成功。

注解开发示例

查看applicationContext.xml文件中的配置

在使用注解代码开发时,会将以上的bean以注解的方式在代码中进行配置。
UserDaoImpl.java新增以下配置:

//
@Component("userDao")

//
@Component("userService")
    //
    @Autowired
    @Qualifier("userDao")


做完以上配置后,运行UserController.java文件后发现控制台报错如下:

这是因为我们虽然在代码中配置了注解,但是在xml中并没有告诉spring我们配置了这些注解,所以要在xml配置组件扫描代码。
applicationContext.xml文件中新增以下代码块:

    

运行UserController.java文件

运行结果


成功打印出结果,说明注解配置成功。

分层注解

在上面的部分我们能够看到有很多的注解都可以用于bean的实例化,但是在上一个例子中只使用了@Component注解,其它的注解是为了更强的语义化。
在UserDaolImpl.java新增以下代码:

@Repository("userDao")


Dao层一般是用于数据持久层的,使用@Repository注解进行标注,这样语义化更好,在开发之后看代码时就能够很好的表示这一层是Dao。
UserServiceImpl.java新增以下代码:

@Service("userService")


这一层是Service所以将注解改成了@Service
运行UserController.java

运行结果


运行结果有打印结果,说明注解配置成功。

属性注入注解方式

①按照类型注入

    @Autowired

②使用id的注入方式

    @Autowired
    @Qualifier("userDao")

使用②时要注意,在配置当中,相同类型的bean在Spring容器中只能存在一个,若存在多个则会不知道应该要注入哪个bean从而出错。
③相当于@Autowired+@Qualifier()的注入方式

	@Resource(name="userDao")

jdk9以上不支持该操作,需要手动导入坐标。
注意:在使用注解进行属性注入时,在对象的内部不需要写对该属性的set方法,但是使用XML进行配置时就一定要协商。
在UserServiceImpl.java文件中的属性注入的注解中进行修改即可,修改之后在运行UserController查看打印结果。即可知道属性注入是否有成功。

普通属性注入

将UserServiceImpl.java定义的代码块进行替换:

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

    @Value("张三")
    private String name;

    @Override
    public void save() {
        System.out.println(name);
        userDao.save();
    }
}

运行结果

运行UserController.java文件:

成功打印出name说明配置成功,但这并不是注解value的主要用法。

普通属性注入使用EL表达式

将UserServiceImpl.java类重点的普通属性注入改为以下代码:

@Value("${jdbc.Driver}")

运行结果

运行UserController.java文件:

这才是注解Value的正确使用方法✔

代码解析


注解中的参数是一个EL表达式,表达式中的值是配置文件中的键值对中的其中一个key。

因为在xml中已经导入了properties文件中的键值对,所以在Spring空间中已经存在了这些键值对,所以在注解中写入EL表达式能够将通过key-value对的方式,通过key将value赋值给变量name。

新增初始化方法与销毁方法

UserController.java替换main方法

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


如果不执行close方法就无法看见destroy()方法的执行结果,因为在执行方法前,对象已经关闭。
UserServiceImpl.java新增以下代码:

    //初始化执行
    @PostConstruct
    public void init(){
        System.out.println("init....");
    }
    
    //对象销毁时执行
    @PreDestroy
    public void destroy(){
        System.out.println("destroy....");
    }
运行结果

Spring新注解

原始注解对于一些xml中的标签无法实现,所以需要引入新注解。

注解说明
@Configuration用于指定当前类是一个 Spring 配置类,当创建容器时会从该类上加载注解
@ComponentScan用于指定 Spring 在初始化容器时要扫描的包。
@Bean使用在方法上,标注将该方法的返回值存储到 Spring 容器中
@PropertySource用于加载.properties 文件中的配置
@import用于导入其他配置类

新注解示例

目录结构:

新建SpringConfiguration.java:

package com.stu.config;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.*;

import javax.sql.DataSource;
import java.beans.PropertyVetoException;


//标志该类是Spring的核心配置类
@Configuration
//
@ComponentScan("com.stu")
//
@import({DataSourceConfiguration.class})
public class SpringConfiguration {

}

新建DataSourceConfiguration.java:

package com.stu.config;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.PropertySource;

import javax.sql.DataSource;
import java.beans.PropertyVetoException;


//
//
@PropertySource("classpath:jdbc.properties")//将properties中的数据载入Spring配置中
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("dataSource") //Spring会将当前方法的返回值以指定名称存储到Spring容器中
    public DataSource getDataSource() throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setDriverClass(driver);
        dataSource.setJdbcUrl(url);
        dataSource.setUser(driver);
        dataSource.setPassword(driver);
        return dataSource;
    }
}

UserController.java新增以下代码:

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfiguration.class);

运行结果


成功打印,说明新注解配置成功。

新注解详解





在@import({…})这个注解中,内容是一组数组,需要引入多个配置类时,在第一个配置类后再加上一个逗号",",然后再写上下一个配置类即可引入。



这样的路径引入的配置文件,文件需要放在resources文件夹才能够找到。



⑤AnnotationConfigApplicationContext类

这个类就是我们之前提到的加载类配置文件对于的Application实现类。

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/275614.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号