容器和注解开发

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)一致的编码风格大大减少了代码的沟通交流成本。

猜你喜欢

转载自blog.csdn.net/liusaidh/article/details/137200932