当前位置: 首页 > news >正文

容器和注解开发

1.创建容器的两种方式


        //1.加载类路径下的配置文件
//ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        //2.从文件系统下加载配置文件(绝对路径)
        ApplicationContext ctx = new FileSystemXmlApplicationContext("D:\\idea-workspace\\spring\\10_container\\src\\main\\resources\\applicationContext.xml");
        //bean加载的方式(三种方式)
//        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
//        BookDao bookDao = ctx.getBean("bookDao",BookDao.class);
        BookDao bookDao = ctx.getBean(BookDao.class);
        bookDao.save();

2.两种加载bean的方式(延迟加载和非延迟加载)

public class AppForBeanFactory {
    public static void main(String[] args) {
        /**
         * 两者初始化bean的不同
         * BeanFactory(容器类的顶层接口):延迟加载bean
         * ApplicationContext是立即加载bean调用无参构造方法

将其设置为延迟加载:

<bean id="bookDao" class="com.liusaidh.dao.impl.BookDaoImpl" lazy-init="true"/>


         */
        Resource resource = new ClassPathResource("applicationContext");
        BeanFactory bf = new XmlBeanFactory(resource);
        BookDao bookDao = bf.getBean(BookDao.class);
        bookDao.save();
    }
}

3.注解开发定义bean

  1. @Component("bookDao") -------》代表bean。为bean起名称为bookDao
    public class BookServiceImpl implements BookService {

}

若不起名称,那么按类型

@Component
public class BookServiceImpl implements BookService {
}

BookService bookService = ctx.getBean(BookService.class);

2)在applicationContext.xml文件中扫描上面的内容:

<context:component-scan base-package="com.liusaidh"/>----------》全类名,或包名

4.三个衍生的注解:

1.@Controller:表现层

2.@Service业务层

3.@Repository数据层

纯注解开发

  1. 创建SpringConfig类代替applicationContext.xml文件

@Configuration设置当前类为配置类
@ComponentScan("com.liusaidh")代表<context:component-scan base-package="com.liusaidh"/>----------》全类名,或包名,来扫描

public class SpringConfig {
}

public class AppForAnnotation {
    public static void main(String[] args) {

//2.读配置文件改为读配置类
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        BookDao bookDao = (BookDao) ctx.getBean("bookDao");
        System.out.println(bookDao);
        BookService bookService = ctx.getBean(BookService.class);
        System.out.println(bookService);
    }
}

5.使用纯注解来控制bean:

@Repository("bookDao")
@Scope("singleton") -----------》设置为单例
public class BookDaoImpl implements BookDao {
    public void save() {
        System.out.println("book dao save ...");
    }
    @PostConstruct ---------------------》初始化
    public void init() {
        System.out.println("init ...");
    }
    @PreDestroy  -------------------》销毁方法
    public void destory() {
        System.out.println("destory  ...");
    }
}

6.纯注解开发的依赖注入、自动装配

1):将BookDao按类型注入到BookService中

@Service
public class BookServiceImpl implements BookService {
      @Autowired ----------------------》按类型装配(但是只能有一个BookDao,不能有UserDao),并且不需要set方法
      private BookDao bookDao;

}

2):将BookDao按名称注入到BookService中

@Autowired//  (不可少)
@Qualifier("bookDao")  //(指定加载bean的名称)
private BookDao bookDao;

:注入基本数据类型:(注入jdbc.prioperties文件中的内容)

@Configuration
@ComponentScan("com.liusaidh")
@PropertySource("jdbc.properties") ----------------》先引入文件(不支持通配符 * )
public class SpringConfig {
}

@Repository("bookDao")
public class BookDaoImpl implements BookDao {
    @Value("${name}") ----------------------》${ }直接注入相应的值
    private String name;

}

7.管理第三方bean和第三方bean的依赖注入

1)JdbcConfig类:

public class JdbcConfig {
     * 简单类型的注入
     @Value("jdbc:mysql://localhost:3306/spring_db")
    private String url;
    @Value("root")
    private String username;
    @Value("123456")
    private String password;
    @Value("com.mysql.jdbc.Driver")
    private String driver;
    //1.定义一个方法获得要管理的对象
    //2.添加bean,表示当前的方法返回的是一个bean
    @Bean
    public DataSource dataSource(BookDaoImpl bookDao){//自动装配,在容器中找对应的bean  ----------------》引用类型的依赖注入:作为方法名的形参传入--------》按类型装配
        System.out.println(bookDao);
        DruidDataSource ds = new DruidDataSource();
        ds.setDriverClassName(driver);
        ds.setUsername(username);
        ds.setPassword(password);
        ds.setUrl(url);
        return ds;
    }
}

  1. :在SpringConfig配置类中导入JdbcConfig类

@Configuration
@ComponentScan("com.liusaidh")
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class,MybatisConfig.class})
public class SpringConfig {
}

8、#{}和${}的区别是什么?


${}是字符串替换,#{}是预处理;使用#{}可以有效的防止SQL注入,提高系统安全性。

Mybatis在处理${}时,就是把${}直接替换成变量的值。

而Mybatis在处理#{}时,会对sql语句进行预处理,将sql中的#{}替换为?号,调PreparedStatement的set方法来赋值;

9.jdbc和nybatis的区别

        JDBC是Java提供的一个操作数据库的API。

        MyBatis是一个持久层ORM(对相映射关系)框架,底层是在JDBC的基础上进行了扩展和封装。

JDBC,MyBatis的区别:
1)从层次上看,JDBC是较底层的持久层操作方式,而MyBatis都是在JDBC的基础上进行了封装使其更加方便程序员对持久层的操作。
2)从功能上看,JDBC就是简单的建立数据库连接,然后创建statement,将sql语句传给statement去执行,如果是有返回结果的查询语句,会将查询结果放到ResultSet对象中,通过对ResultSet对象的遍历操作来获取数据;MyBatis是将sql语句中的输入参数和输出参数映射为java对象,sql修改和优化比较方便。
3)从使用上看,如果进行底层编程,而且对性能要求极高的话,应该采用JDBC的方式;如果要灵活使用sql语句的话建议采用MyBatis框架。

MyBatis相比JDBC的优势
(1) mybatis使用已有的连接池管理,避免浪费资源,提高程序可靠性。
(2) mybatis提供插件自动生成DAO层代码,提高编码效率和准确性。
(3) mybatis 提供了一级和二级缓存(需要配置打开),提高了程序性能。
(4) mybatis使用动态SQL语句,提高了SQL维护。(此优势是基于XML配置)
(5) mybatis可使用配置文件管理sql语句:使用JDBC对数据库进行操作时,SQL查询语句分布在各个Java类中,这样可读性差,不利于维护,当我们修改Java类中的SQL语句时要重新进行编译;Mybatis可以把SQL语句放在配置文件中统一进行管理,以后修改配置文件就行,也不需要重新编译部署。
(5) mybatis对数据库操作结果进行自动映射:在使用JDBC进行查询时,返回一个结果集ResultSet,我们要从结果集中取出结果封装为需要的类型;在Mybatis中可以设置将结果直接映射为自己需要的类型,比如:JavaBean对象、一个Map、一个List等等。
(6)一致的编码风格大大减少了代码的沟通交流成本。

http://www.lryc.cn/news/328984.html

相关文章:

  • 有趣且重要的JS知识合集(21)浏览器内置对象讲解之Dom篇
  • 3.两数相加 - 链表
  • iptables 与 firewalld 防火墙
  • Taskflow:异步任务(Asynchronous Tasking)
  • 学习鸿蒙基础(9)
  • spring boot的小数位丢失.00 或者.0
  • nginx如何清理页面缓存
  • 深度学习pytorch——经典卷积网络之ResNet(持续更新)
  • react 面试题(2024 最新版)
  • JVM(三)——字节码技术
  • HarmonyOS 应用开发之Stage模型绑定FA模型ServiceAbility
  • 高效解决Visual Studio无法识别到自定义头文件
  • [数据集][目标检测]道路行人车辆坑洞锥形桶检测数据集VOC+YOLO格式6275张4类别
  • 风险与收益
  • linux服务器安装mysql8
  • 亚信安全荣获2023年度5G创新应用评优活动两项大奖
  • linux之忘记root密码
  • jspm智能仓储系统
  • 深入理解数据结构(3):栈和队列详解
  • 单例设计模式(3)
  • 将jupyter notebook文件导出为pdf(简单有效)
  • 使用INSERT INTO ... ON DUPLICATE KEY UPDATE批量插入更新导入excel数据的实践场景应用
  • AJAX-项目优化(目录、基地址、token、请求拦截器)
  • SQLite中的动态内存分配(五)
  • 快速上手Spring Cloud 十一:微服务架构下的安全与权限管理
  • 如何简化多个 if 的判断结构
  • 发掘服务器硬件优势:怎样有效管理、维护、更新
  • SD卡备份和烧录ubuntu20.04镜像
  • 短视频账号矩阵系统/开发 -- -- -- 蒙太奇算法上线
  • Docker Stack(堆栈) 部署多服务集群,多服务编排