Java-m

1. 怎么进行sql优化

      1.优化表结构

        1.1尽量使用数字型字段

        1.2尽可能的使用 varchar 代替 char

        1.3对作为查询条件和order by的字段建立索引

        1.4当索引列大量重复数据时,可以把索引删除掉

        1.5一个表中索引最多不要超过6个。 

       2.通过优化查询

        2.1避免在 where 子句中对字段进行 null 值判断

        2.2应尽量避免在 where 子句中使用!=或<>操作符\

        2.3应尽量避免在 where 子句中使用 or 来连接条件

        2.4应尽量避免在 where中使用 in 和 not in

        2.5应尽量避免使用like关键字作为查询条件

        2.7使用索引字段作为条件时,复合索引的使用 

        2.8很多时候用 exists 代替 in 是一个好的选择 

        2.9任何查询也不要出现select *

        2.10尽量避免大事务操作,提高系统并发能力。

(109条消息) 面试:请谈谈你日常如何做SQL优化_日常工作中你是怎么优化sql的?_fubo1990的博客-CSDN博客

 2. 怎么防止sql 注入

预防 SQL 注入攻击的方法

        1.严格限制 Web 应用的数据库的操作权限,给连接数据库的用户提供满足需要的最低权限,最大限度的减少注入攻击对数据库的危害
        2.校验参数的数据格式是否合法(可以使用正则或特殊字符的判断)
        3.对进入数据库的特殊字符进行转义处理,或编码转换
        4.预编译 SQL(Java 中使用 PreparedStatement),参数化查询方式,避免 SQL 拼接
        5.发布前,利用工具进行 SQL 注入检测
报错信息不要包含 SQL 信息输出到 Web 页面

 3.Spirng ioc的实现原理
        控制反转 ioc
        di 把对应的属性加载到对象中 强调的是调用者去使用对象实例的时候 spring提供对象实例的过程
        工厂模式——把对类的创建初始化全都交给一个工厂来执行,而用户不需要去关心创建的过程是什么样的
        反射 ——反射可以在运行时根据指定的类名获得类的信息

4.beanfactory作用
        beanfactory是一个顶层接口
        是bean的工厂,主要作用就是生产bean
        实现了工厂模式
        他也是一个spring容器 管理着某个对象的生命周期 

5..BeanFactory和ApplicationContext的区别
        共同点:都是生产bean
        不同点:应用上下文,继承BeanFactory接口,它是Spring的一各更高级的容器,提供了更多的有用的功能;
        1) 国际化(MessageSource)

        2) 访问资源,如URL和文件(ResourceLoader)

        3) 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层  

        4) 消息发送、响应机制(ApplicationEventPublisher)

        5) AOP(拦截器)

6.bean 的生命周期/实例化过程

普通bean 对象创建步骤

        1.java源码被编译为class文件

        2.等到类要被初始化时,class文件被虚拟机通过类加载器加载到jvm中

        3.初始化对象供我们使用

可以理解为它是用Class对象作为「模板」进而创建出具体的实例

 

首先是Spring Bean的生命周期过程,Spring使用BeanDefinition来装载着我们给Bean定义的元数据

候选者:实例化Bean的时候实际上就是遍历BeanDefinitionMap

候选者:Spring的Bean实例化和属性赋值是分开两步来做的

候选者:在Spring Bean的生命周期,Spring预留了很多的hook给我们去扩展

候选者:1):Bean实例化之前有BeanFactoryPostProcessor

候选者:2):Bean实例化之后,初始化时,有相关的Aware接口供我们去拿到Context相关信息

候选者:3):环绕着初始化阶段,有BeanPostProcessor(AOP的关键)

候选者:4):在初始化阶段,有各种的init方法供我们去自定义

候选者:而循环依赖的解决主要通过三级的缓存

候选者:在实例化后,会把自己扔到三级缓存(此时的key是BeanName,Value是ObjectFactory)

候选者:在注入属性时,发现需要依赖B,也会走B的实例化过程,B属性注入依赖A,从三级缓存找到A

候选者:删掉三级缓存,放到二级缓存

  • 实例化 Instantiation
  • 属性赋值 Populate
  • 初始化 Initialization
  • 销毁 Destruction

 

参考博客:javabean和spring中bean对象是一回事吗,它们分别都有什么含义? - 知乎 (zhihu.com) 

(109条消息) 一文读懂 Spring Bean 的生命周期_spring bean的生命周期_老周聊架构的博客-CSDN博客


7. Spring 中的 bean 的作用域有哪些?

        singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。
        prototype : 每次请求都会创建一个新的 bean 实例。
        request : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
        session : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。
        global-session: 全局 session 作用域,仅仅在基于 Portlet 的 web 应用中才有意义,Spring5 已经没有了。Portlet 是能够生成语义代码(例如:HTML)片段的小型 Java Web 插件。它们基于 portlet 容器,可以像 servlet 一样处理 HTTP 请求。但是,与 servlet 不同,每个 portlet 都有不同的会话。
————————————————

9 spring bean 是线程安全吗
        1>对于prototype作用域,每次都生成一个新的对象,所以不存在线程安全问题。

        2>对于singleton作用域,默认就是线程不安全的。但是对于开发中大部分的bean,其实都是无状态的,不需要保证线程安全。

10.spring bean如何处理并发问题
        1、单例变原型
        2、尽量避免使用成员变量 (读写操作 )
        3、使用并发安全的类

11.Bean实例化的方式
        1.构造器方式
        2.静态工厂模式 factory-method
        3.实例化工厂模式 factory-bean+factory-method
        @bean 

12.spring自动装配Bean的五种方式

  1. no:默认方式,手动装配方式,需要通过ref设定bean的依赖关系
  2. byName:根据bean的名字进行装配,当一个bean的名称和其他bean的属性一致,则自动装配
  3. byType:根据bean的类型进行装配,当一个bean的属性类型与其他bean的属性的数据类型一致,则自动装配
  4. constructor:根据构造器进行装配,与 byType 类似,如果bean的构造器有与其他bean类型相同的属性,则进行自动装配
  5. autodetect:如果有默认构造器,则以constructor方式进行装配,否则以byType方式进行装配

 13 .Spring中Bean装配方式
        1.自动装配:Spring的<bean>元素中包含一个autowired的属性
        2.使用XML装配 @component 通过反射调用构造方法 前提是扫描包<component-scan>

                设值注入:Spring配置文件中需要使用<bean>元素的子元素<property>来为每个属性注入值。
                构造注入:Spring配置文件中需要使用<bean>元素的子元素<constructor-arg>来定义构造方法的参数,可以使用其value属性来设置参数的值。
        3.使用java装配 @bean 自己实例化对象
        4.@import

14.@Autowired 和@Resource 的区别
        @Autowired注解默认按类型(byType)装配依赖对象,它要求依赖对象必须存在;若允许依赖对象不存在,可设:@Autowired(required = false) 。
        @Autowired也可以按名称(byName)装配,需要结合@Qualifier:
        @Resource默认按名称(byName)装配,也可按类型装配

15.@autowired 自动装配的过程

@Autowired注入过程,实际上分为三个方面:1、元信息解析;2、依赖查找;3、依赖注入(字段、方法)

 autowired 通过bean的后置处理器来解析的
 1.创建一个spring上下文,在构造函数中进行注册 调用AutowiredAnnotationBeanPostProcessor方法进行属性注入
 2.在bean 的创建中进行解析
    1.在实例化过后预解析(解析autowired标注的这些属性方法,把这些属性的类型,名称 属性所在的类 元数据缓存起)
    2.在属性注入进行真正的解析(拿到上一步缓存的元数据,去ioc 容器中进行查找,并且返回注入)

18. 有哪些不同类型的IOC(依赖注入)方式?

构造器依赖注入:构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。

Setter方法注入:Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。

19. 哪种依赖注入方式你建议使用,构造器注入,还是 Setter方法注入?

你两种依赖方式都可以使用,构造器注入和Setter方法注入。最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值