S++

千线一眼

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

Spring-注解开发

原始注解

原始注解主要是来替代Bean标签的配置

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

我们事先创建好UserDao和UserService接口和它们的实现类UserDaoImpl、UserServiceImpl

配置组建扫描

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
">

    <!--配置在指定包下组件扫描-->
    <context:component-scan base-package="com.sjj" />
</beans>

简单演示

package com.sjj.dao.impl;

import com.sjj.dao.UserDao;
import org.springframework.stereotype.Component;

@Component("userDao")
public class UserDaoImpl implements UserDao {
    @Override
    public void userDaoTest() {
        System.out.println("测试");
    }
}
package com.sjj.service.impl;

import com.sjj.dao.UserDao;
import com.sjj.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component("userService")
public class UserServiceImpl implements UserService {

    @Autowired
    @Qualifier("userDao")
    private UserDao userDao;

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

    @Override
    public void UserServiceTest() {
        userDao.userDaoTest();
    }
}
package com.sjj.service;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserServiceTest {
    @Test
    public void test_1(){
        ApplicationContext app = new ClassPathXmlApplicationContext("appContext.xml");
        UserService userService = (UserService) app.getBean("userService");
        userService.UserServiceTest();
    }
}

新注解

在原始注解的基础上我们考虑,
如果我们使用第三方的包,难道要在第三方包的源码中加注解吗?这显然会玷污了源码的清白。
非自定义的Bean标签如何表示?加载properties的配置如何表示?扫描组件的配置如何表示?
所以我们选择使用新注解。

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

简单演示

导入mysql、c3p0配置,编写好你的jdbc.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/数据库名称
jdbc.username=用户
jdbc.password=密码

创建一个DataSourceConfig类作为数据源的配置类

package com.sjj.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;

// 加载配置文件:<context:property-placeholder location="jdbc.properties" />
@PropertySource("classpath:jdbc.properties")
public class DataSourceConfig {

    @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")
    public DataSource getDataSource() throws Exception{
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setDriverClass(driver);
        dataSource.setJdbcUrl(url);
        dataSource.setUser(username);
        dataSource.setPassword(password);
        return dataSource;
    }
}

创建一个SpringConfig类作为Spring的核心配置类

package com.sjj.config;
/**
 * Spring核心配置类
 */

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

// 标志该类是Spring的核心配置类
@Configuration
// 组件扫描:<context:component-scan base-package="com.sjj" />
@ComponentScan("com.sjj")
// 加载其它配置类
@Import(DataSourceConfig.class)
public class SpringConfig {
    
}

测试方法

import com.sjj.config.SpringConfig;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;

    @Test
    public void test_2() throws SQLException {
        // 参数是核心配置类的class
        ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfig.class);
        UserService userService = app.getBean(UserService.class);
        userService.UserServiceTest();

        // DataSource参数返回到了Bean标签
        DataSource source = (DataSource) app.getBean("dataSource");
        Connection connection = source.getConnection();
        System.out.println(connection);
        connection.close();
    }

posted on   S++  阅读(28)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示