Java面试官最爱问的垃圾回收机制,Java编程配置思路详解

Java编程配置优点:相对于xml配置而言,其结构更清晰,可读性更高,同时也节省了解析xml耗时。

Java编程配置缺点:修改应用配置参数需要重新编译。其实并不是一个大的问题,实际生成环境中,应用配置完成后一般都不会也不敢去随意修改。

两者各有千秋,考虑到Spring4.x和SpringBoot都在推荐使用Java编程配置的方式,那我们也应该顺应时代潮流,你可以不用,但你应该要懂!

Java编程配置步骤

第一步:创建配置类,在类名上添加注解Configuration,告知Spring这是一个配置类,其作用类似xml文件

第二步:加载外部配置文件,在类名上添加注解PropertySource,指定properties文件的读取路径

第三步:获取应用配置属性值,在属性变量上添加注解Value,通过${}表达式获取配置文件中参数

第四步:依赖注入,在方法上添加Bean注解,也可以用FactoryBean

第一步和第四步的语法,文章第二部分会详细介绍。第二步和第三步的语法,文章第三部分会详细介绍。


`import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.PropertySource;

import org.springframework.jdbc.core.JdbcTemplate;

import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import org.springframework.transaction.PlatformTransactionManager;

import org.springframework.transaction.annotation.EnableTransactionManagement;

import com.mchange.v2.c3p0.ComboPooledDataSource;



/**  * Spring 配置类  * 配置数据源,事务管理,bean,自动扫描包  * @author itdragon  */

@Configuration  // 声明该类为配置类

@PropertySource({"classpath:propertySource.properties"})    // 引入外部文件

@ComponentScan("com.itdragon")  // 配置自动扫描包的路径

@EnableTransactionManagement    // 开启基于注解的事务管理功能

public class ApplicationContextConfig {

    

    @Value("${DATA_USER}")

    private String DATA_USER;

    

    @Value("${DATA_PAWD}")

    private String DATA_PAWD;

    

    @Value("${DATA_DRIVER}")

    private String DATA_DRIVER;

    

    @Value("${DATA_JDBC_URL}")

    private String DATA_JDBC_URL;

    

    @Bean // 数据源

    public DataSource dataSource() throws Exception{

        ComboPooledDataSource dataSource = new ComboPooledDataSource();

        dataSource.setUser(DATA_USER);

        dataSource.setPassword(DATA_PAWD);

        dataSource.setDriverClass(DATA_DRIVER);

        dataSource.setJdbcUrl(DATA_JDBC_URL);

        return dataSource;

    }

    

    @Bean // jdbc模板

    public JdbcTemplate jdbcTemplate() throws Exception{

        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource());

        return jdbcTemplate;

    }

    

    @Bean // 事务管理

    public PlatformTransactionManager transactionManager() throws Exception{

        return new DataSourceTransactionManager(dataSource());

    }



}`

事务类


`import java.util.List;

import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Transactional;

import com.itdragon.dao.ITDragonDao;



@Service

public class ITDragonServer {

    

    @Autowired(required=false)

    private ITDragonDao itdragonDao;



    public List<Map<String,Object>> findAll() {

        return itdragonDao.findAll();

    }

    

    @Transactional

    public void updateNameById(String name, Long id) {

        itdragonDao.updateUserNameById(name, id);

        System.out.println(0/0); // 事务异常

    }

}`

完整代码,请异步github

二、组件注入


Bean注解类似xml文件中的<bean>标签,其中被Bean注解修饰的方法名对应<bean>标签中的id,也可以通过Bean注解的value属性设置id的值。在SpringBoot底层代码中被大量使用。

若希望容器启动后创建对象,并在使用后从容器中直接获取,则什么都不需要做,因为Spring默认是单实例,即容器启动后创建对象,并保存到容器中,使用时再从容器中获取。

若希望容器启动后不创建对象,而是在使用时再创建,继而保存到容器中,下次使用再从容器中获取,可以通过懒加载的方式实现,即使用Lazy注解修饰。

若希望容器启动后不创建对象,而是在每次使用时创建,则采用多实例的方式,即使用Scope注解,参数的值为prototype,即@Scope(“prototype”) 。

若希望容器启动后根据条件选择需要注入的Bean,可以使用注解Conditional判断,SpringBoot的底层打量使用了该注解。


`import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.ComponentScan.Filter;

import org.springframework.context.annotation.Conditional;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.FilterType;

import org.springframework.context.annotation.Lazy;

import org.springframework.stereotype.Controller;

import com.itdragon.entity.ITDragonEntity;

import com.itdragon.server.ITDragonServer;



/**  * 知识点二:配置自动扫描包路径  * 一、注解ComponentScan的value值设置自动扫描包的路径  * 二、注解ComponentScan的excludeFilters值设置扫描排除的规则  *  1)、通过注解@Filter设置排除的类型,type=ANNOTATION表示按照注解包含排除。classes是具体的注解,如Controller,Server,Repository  * 三、注解ComponentScan的includeFilters值设置扫描加入的规则  *  1)、通过设置useDefaultFilters=false关闭Spring默认扫描全部的功能,使includeFilters生效  *  * 知识点三:@Filter常用的拦截类型  * 一、FilterType.ANNOTATION:按照注解  * 二、FilterType.ASSIGNABLE_TYPE:按照给定的类型,包括其子类和实现类  * 三、FilterType.CUSTOM:使用自定义规则  *  * 第一个ComponentScan注解表示在指定包下不扫描通过Controller注解修饰的类和ITDragonServer类及其子类和实现类  * 第二个ComponentScan注解表示在指定包下只扫描通过Controller注解修饰的类  * 第三个ComponentScan注解表示在指定包下根据自定义拦截规则,不扫描满足规则的类  */

@Configuration

@ComponentScan(value="com.itdragon",excludeFilters={@Filter(type=FilterType.ANNOTATION,classes={Controller.class}),

        @Filter(type=FilterType.ASSIGNABLE_TYPE,classes={ITDragonServer.class})})

//@ComponentScan(value="com.itdragon",includeFilters={@Filter(type=FilterType.ANNOTATION,classes={Controller.class})},useDefaultFilters=false)

//@ComponentScan(value="com.itdragon",excludeFilters={@Filter(type=FilterType.CUSTOM,classes={ITDragonCustomTypeFilter.class})})

public class ITDragonConfig {

    

    /**  * 知识点一:配置bean  * 一、注解Bean的value值表示bean的id  * 二、注解Bean的value值未设置,则方法名表示bean的id  */

    @Bean(value="itdragonBean")

    public ITDragonEntity itdragonEntity() { //方法名很重要,类似xml的id名,也可以通过@bean的value值重定义

        return new ITDragonEntity("itdragon", "configuration-password", 25);

    }

    

    /**  * 知识点四:Scope属性  * @Scope,调整作用域,默认单实例  * singleton:单实例:ioc容器启动后创建对象放到ioc容器中,需要是从容器中获取。  * prototype:多实例:ioc容器启动后每次获取对象时都要创建对象。  * request:同一次请求创建一个实例  * session:同一个session创建一个实例  *  * 知识点五:懒加载  * 针对单实例而言,在容器启动后不创建对象,在第一次使用Bean时创建对象。可以理解为单实例的一种补充。  *  */

//  @Scope("prototype")

    @Lazy

    @Bean

    public ITDragonEntity scopeTopicBean() {

        System.out.println("^^^^^^^^^^^^^^^^^^^^^Create Bean");

        return new ITDragonEntity("scopeBean", "singleton-prototype-request-session", 25);

    }

    

    /**  * 知识点六:Conditional条件判断  * 满足条件才会注册bean,可以修饰在类上,管理整个类下的组件注入。  */

    @Bean

    @Conditional({ITDragonCustomCondition.class})

    public ITDragonEntity conditionalBean() {

        return new ITDragonEntity("conditionalBean", "Conditional-Condition-CustomCondition", 25);

    }

    

    /**  * 知识点七:FactoryBean工厂Bean  * FactoryBean默认通过调用getObject创建的对象,通过调用isSingleton设置单实例和多实例。  */

    @Bean

    public ITDragonFactoryBean itdragonFactoryBean() {

        return new ITDragonFactoryBean();

    }

}`

自定义的条件判断组件注入类


`import org.springframework.beans.factory.support.BeanDefinitionRegistry;

import org.springframework.context.annotation.Condition;

import org.springframework.context.annotation.ConditionContext;

import org.springframework.core.type.AnnotatedTypeMetadata;

## 结局:总结+分享

看完美团、字节、腾讯这三家的一二三面试问题,是不是感觉问的特别多,可能咱们真的又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。

开篇有提及我可是足足背下了**Java互联网工程师面试1000题**,多少还是有点用的呢,换汤不换药,不管面试官怎么问你,抓住本质即可!能读到此处的都是真爱,所以福利也为你准备,这份1000题免费送你!**[点击这里免费领取](https://gitee.com/vip204888/java-p7)**

*   **Java互联网工程师面试1000题**

![image.png](https://www.icode9.com/i/ll/?i=img_convert/971a908076810329926683e37761d89d.png)

而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的 《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题。

*   **程序员代码面试指南--IT名企算法与数据结构题目最优解**

![image.png](https://www.icode9.com/i/ll/?i=img_convert/33e77993980f0a89f08cd88b23b8510f.png)


*   其余像设计模式,建议可以看看下面这4份PDF(已经整理)

![image.png](https://www.icode9.com/i/ll/?i=img_convert/f3b1778bb27cb5ea091bebfee9e491f1.png)


*   更多的Java面试学习笔记如下,关于面试这一块,我额外细分出Java基础-中级-高级开发的面试+解析,以及调优笔记等等等。。。

![image.png](https://www.icode9.com/i/ll/?i=img_convert/698d7b2db1562429f45795d13d4b90e9.png)


法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的 《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题。

*   **程序员代码面试指南--IT名企算法与数据结构题目最优解**

[外链图片转存中...(img-yuS4Stkc-1628076003575)]


*   其余像设计模式,建议可以看看下面这4份PDF(已经整理)

[外链图片转存中...(img-u0V9fpwZ-1628076003577)]


*   更多的Java面试学习笔记如下,关于面试这一块,我额外细分出Java基础-中级-高级开发的面试+解析,以及调优笔记等等等。。。

[外链图片转存中...(img-IOhdZfqM-1628076003579)]


以上所提及的全部Java面试学习的PDF及笔记,如若皆是你所需要的,那么都可发送给你!
上一篇:SpringSecurity的demo笔记


下一篇:【JavaWeb 注解】快速了解注解的概念、分类以及使用自定义注解完成简单的测试异常框架类