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
- :@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数据层
纯注解开发
- 创建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;
    }
}
- :在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)一致的编码风格大大减少了代码的沟通交流成本。