首页 > 其他分享 >Bean的基本注解开发

Bean的基本注解开发

时间:2023-02-24 21:46:32浏览次数:38  
标签:String Value class Bean 开发 druidDataSource 注解 public

Bean基本注解开发

bean里面不需要配置,在类上加注解:@Component(bean的id)

@Component("userService")
public class UserServiceImpl implements UserService {
  
    @Override
    public void show() {
        System.out.println("show方法");
    }
}

在bean加上包扫描对象,让它扫描到注解

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

然后再getBean,调用show方法,可以运行。

但是bean标签上面还有一些属性,scope、lazy、destory等等,通过下面注解来修改配置:

xml配置对应注解描述
scpoe=""@Scpoebean的作用范围,值为singleton或者prototype
lazy-init@lazy是否延迟加载,取值true、false
init-method@PostConstruct初始化方法
destory-method@PreDestory销毁前执行方法

@Component的衍生注解

衍生注解描述
@RepositoryDao层类使用
@ServiceService层类上使用
@ControllerWeb层类上使用

spring注解进行属性注入

注解描述
@Value用于注入普通数据,放在属性定义上,或者set方法上
@Autowired根据类型(byType)注入引用数据
@Qualifier结合@Autowired,根据名称注入
@Resource根据类型或名称进行注入
@Value("${driver}")
private String userName;
@Value("张三")
public void setUserName(String userName) {
    this.userName = userName;
}

当只有一个UserDao类型的时候可以根据类型找,但是有多个实现类的时候,当把注解放在变量上面的时候,它内部会自动生成一个set方法,然后根据属性名不同会取得不同的对象

@Autowired
private UserDao dao2;//查到的时Impl2实现类

把他放在set方法上是按照参数名字取匹配

@Autowired
public void setUserdao(UserDao dao1) {
    //当有多个daoImpl时,set形参里面的名字会取得不同的对象
    this.userdao = dao1;//查到的是Impl1实现类

当我set的时候,参数给集合,他会识别所有的类型为UserDao的类

@Autowired
public void setUserdao(List<UserDao> daoList) {
    System.out.println(daoList);//打印出所有的userDaoImpl
}

@Resource,不指定名称参数时,一句类型注入,指定name的时候就根据名称匹配

@Resource(name="dao2")
private UserDao dao;
@Resource
private UserDao dao;

非自定义bean:类上面需要加component注解,不然扫描不到这个bean,方法名上加注解bean

@Component
public class BeanFactoryTest {
    @Bean("dataSource")
    public DataSource getDataSources(@Value("${driver}") String driverClassName,
                                     @Qualifier("dao2") UserDao userDao,
                                     UserService userService) {
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(driverClassName);
        System.out.println(userDao);
        System.out.println(userService);
        return druidDataSource;
    }
}

在bean注解里面可以配置id,如果不加的话默认id为方法名,如果想要注入参数,也可以通过注解传参

配置类

看application.xml的配置内容目前就两个:扫描仪,读取配置文件

<context:property-placeholder location="classpath:jdbc.properties"/>
<!--扫描指定包,产生Mapper对象存储到spring容器-->
<context:component-scan base-package="com.liku"/>

创建配置类,在上面添加注解:

package com.liku.config;

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

@Configuration
//扫描指定包下面的component
@ComponentScan({"com.liku.dao","com.liku.service"})
//读取配置文件源
@PropertySource({"classpath:jdbc.properties"})
//导入外部配置类
@Import(BeanFactoryTest.class)
public class BeansConfig {
}

然后再次试试取出之前用注解设置的bean,可以正常取出!

其他注解

@Primary:设置bean优先被使用,当类型相同的时候,优先使用有这个注解的

@Profile:环境切换,只有激活了当前环境被标注的bean才会被注册到spring容器,相当于

<beans profile="test"> //只有在test环境下才会被激活

激活指定环境可以通过

命令行动态参数激活
-Dspring.profiles.active=test
使用代码激活
System.setProperty("spring.profiles.active","test");

没有标注profile的环境在任何环境下都可以使用

利用注解方式集成Mybatis

配置类:

//标记为配置类
@Configuration
//扫描指定包下面的component
@ComponentScan({"com.liku.dao", "com.liku.service"})
//读取配置文件源
@PropertySource({"classpath:jdbc.properties"})
@MapperScan("com.liku.mapper")
public class BeansConfig {

    @Bean//数据源对象
    public DataSource dataSource(
            @Value("${driver}") String driver,
            @Value("${url}") String url,
            @Value("${user}") String username,
            @Value("${pwd}") String password
    ) {
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(driver);
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        return druidDataSource;
    }
    @Bean//将sqlsession交给spring管理
    public SqlSessionFactoryBean sessionFactoryBean(DataSource dataSource) {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean;
    }

}

mapper层:

@Repository("sysuserMapper")
public interface SysuserMapper {
    /**
     * 查询所有用户信息
     * @return
     */
    List<Sysuser> selectAll();
}

service层:

@Service("userService")
public class UserServiceImpl implements UserService {
    @Autowired
    private SysuserMapper sysuserMapper;
    @Override
    public void show() {
        sysuserMapper.selectAll().forEach(System.out::println);
    }
}

测试:

public static void main(String[] args) {
    ApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeansConfig.class);
    UserService userService = applicationContext.getBean("userService",UserService.class);
    userService.show();
}

除了可以在类上加@import(配置类.class)注解的方式加载外部配置类,还可以通过实现接口的方式:

1、实现ImportSelector接口重写selectImports方法,在配置类上的注解导入该类

public class Config3 {
    @Bean//将sqlsession交给spring管理
    public SqlSessionFactoryBean sessionFactoryBean(DataSource dataSource) {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        return sqlSessionFactoryBean;
    }
}
public class ImportBean2 implements ImportSelector {
    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{Config3.class.getName()};//导入配置类
    }
}
//标记为配置类
@Configuration
//扫描指定包下面的component
@ComponentScan({"com.liku.service"})
//读取配置文件源
@PropertySource({"classpath:jdbc.properties"})
@MapperScan("com.liku.mapper")
@Import({ImportBean.class})
public class BeansConfig {

    @Bean//数据源对象
    public DataSource dataSource(
            @Value("${driver}") String driver,
            @Value("${url}") String url,
            @Value("${user}") String username,
            @Value("${pwd}") String password
    ) {
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(driver);
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        return druidDataSource;
    }
}

2、实现ImportBeanDefinitionRegistrar接口,重写里面的注册方法:

@ComponentScan({"com.liku.dao"})
public class BeansConfig2 {
}
public class ImportBean implements ImportBeanDefinitionRegistrar {

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {
        BeanDefinition definition=new RootBeanDefinition();
        definition.setBeanClassName(BeansConfig2.class.getName());
        registry.registerBeanDefinition("configClass2",definition);//导入配置类
    }
}

在配置类上导入该类:

@Import({ImportBean.class,ImportBean2.class})

上面两个类都没有添加@configuration注解,而是通过导入实现类,而实现类中已经导入了那两个配置类,因此可以直接用。也可以自定义一个注解,在注解上导入实现类,在需要的配置类中添加自定义注解:

标签:String,Value,class,Bean,开发,druidDataSource,注解,public
From: https://www.cnblogs.com/Liku-java/p/17153268.html

相关文章

  • 基于SpringBoot+Vue开发的前后端分离博客项目一一后端开发
    @目录前言一、Java后端接口开发1.新建SpringBoot项目1.1开发技术栈:1.2pom中jar包引入:1.3配置文件:2.整合mybatisPlus2.1引入pom的jar包2.2配置分页插件、代码生成......
  • 路飞项目day01 软件开发流程、PIP永久换源、虚拟环境、路飞项目开始
    一、软件开发流程(重要)​ 我们作为一个后端,虽然一般情况下只专注自己的那一部分事情,但是有时候小公司,人员架构没那么细化,或者老板就是想省钱少招点人,我们就得大致熟悉软件......
  • REST开发(1)
    REST风格REST简介Rest(RepresentationalStateTransfer),表现形式状态转换(访问网络资源的形式)传统风格资源描述形式http://localhost/user/getById?id=1(得到信息......
  • web开发-请求参数处理
    请求参数处理请求映射做所有web开发之前最想要做的就是请求映射编写一个controller,在每一个方法上注解@RequestMapping("/..."),来声明方法处理什么请求。这个声明过程......
  • Web开发
    学习目标(深入Web原理)SpringMVC自动配置简单功能介绍请求参数处理数据影响与内容协商视图解析与模板引擎拦截器跨域异常处理原生Servlet敲入式Web容器定制化......
  • 路飞项目 :软件开发流程 与 路飞项目需求
    目录1软件开发流程2路飞项目需求1软件开发流程#真正的企业里软件从立项到交付整个过程 -立项:确定公司要开发这个软件公司高层 -软件来源 -产品经......
  • 嵌入式系统Linux工控机支持二次开发
    一、智慧城市概述智慧城市(SmartCity)是一种建立在运用最新信息技术和通信技术的支撑上的发展目标,目的在于为居民提供综合、可持续的服务,通过对社会形态、经济状况和环境状况......
  • 路飞项目,软件开发流程,路飞项目需求,路飞前后端创建,后端项目调整
    路飞项目软件开发流程真正的企业里软件从立项到交付整个过程立项:确定公司要开发这个软件 公司高层决定​ 软件来源​ 产品经理设计出来》互联网项目互联网公司​......
  • Field userService in com.lin.hms.controller.LogController required a bean of typ
    需要一个bean但找不到解决我们在controller使用的service没有注入spring容器,那么我们可以在启动类上,加上包扫描注解,让这个bean所在的包能扫描到:@ComponentScan(basePa......
  • BeanUtils.copyProperties
    BeanUtils是开发中常用到的工具类.而获取这一工具类主要是通过导入org.springframework.beans.BeanUtils或者org.apache.commons.beanutils.BeanUtils包来获取.但是不同......