目录
一:IOC/DI配置管理第三方bean
<dependency><groupId> org.springframework </groupId><artifactId> spring-context </artifactId><version> 5.2.10.RELEASE </version></dependency>
<dependency><groupId> com.alibaba </groupId><artifactId> druid </artifactId><version> 1.1.16 </version></dependency>
配置文件:
<bean class = "com.alibaba.druid.pool.DruidDataSource" ><property name = "driverClassName" value = "com.mysql.jdbc.Driver" /><property name = "url" value = "jdbc:mysql://localhost:3306/spring_db" /><property name = "username" value = "root" /><property name = "password" value = "root" /></bean>
public static void main ( String [] args ) {ApplicationContext ctx = newClassPathXmlApplicationContext ( "applicationContext.xml" );DataSource dataSource = ( DataSource ) ctx . getBean ( "dataSource" );System . out . println ( dataSource );}
这里就可以实现了Druid的管理
(二)实现c3p0的管理:
<dependency><groupId> mysql </groupId><artifactId> mysql-connector-java </artifactId><version> 5.1.47 </version></dependency>
<dependency><groupId> c3p0 </groupId><artifactId> c3p0 </artifactId><version> 0.9.1.2 </version></dependency>
配置第三方bean
<bean id = "dataSource" class = "com.mchange.v2.c3p0.ComboPooledDataSource" ><property name = "driverClass" value = "com.mysql.jdbc.Driver" /><property name = "jdbcUrl" value = "jdbc:mysql://localhost:3306/spring_db" /><property name = "user" value = "root" /><property name = "password" value = "root" /><property name = "maxPoolSize" value = "1000" /></bean>
这样就可以直接获得相应的连接了。
但是会发现这样会很不安全,很不安全。因为直接在注解配置文件中就展现出了账户密码。
(三)Properties的配置文件
依然是在resource下面去创建jdbc.properties文件,并添加数据。
jdbc.driver = com.mysql.jdbc.Driverjdbc.url = jdbc : mysql : //127.0.0.1 : 3306/spring_dbjdbc.username = rootjdbc.password = root
然后就是很重要的 开启context 命名空间
<?xml version="1.0" encoding="UTF-8"?><beans xmlns = "http://www.springframework.org/schema/beans"xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"xmlns:context = "http://www.springframework.org/schema/context"xsi:schemaLocation = "http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/springcontext.xsd" ></beans>
之后在配置文件中context下就可以获取了jdbc的相应数据了
<context:property-placeholder location = "jdbc.properties" /><bean id = "dataSource" class = "com.alibaba.druid.pool.DruidDataSource" ><property name = "driverClassName" value = "${jdbc.driver}" /><property name = "url" value = "${jdbc.url}" /><property name = "username" value = "${jdbc.username}" /><property name = "password" value = "${jdbc.password}" /></bean>
当然了,至此就可以实现了读取properties的内容了。同时也可以了直接获取了name中这些的数值了。
现在又有了一个问题,就是说如果有多个properties需要加载呢
<context:property-placeholderlocation = "jdbc.properties,jdbc2.properties" system-propertiesmode = "NEVER" /><!-- 方式二 --><context:property-placeholder location = "*.properties" systemproperties-mode = "NEVER" /><!-- 方式三 --><context:property-placeholder location = "classpath:*.properties"system-properties-mode = "NEVER" /><!-- 方式四 --><context:property-placeholder location = "classpath*:*.properties"system-properties-mode = "NEVER" />
system-properties-mode="NEVER"其中的这句话就是说,不加载系统的属性,以防止某些时候,出现了加载了系统属性数值而没有加载你自己添加的数值。
二:IOC/DI的注解开发
(一)容器的创建方式:
1类路径下的XML配置文件
ApplicationContext ctx = newClassPathXmlApplicationContext ( "applicationContext.xml" );
2文件系统下的XML配置文件
ApplicationContext ctx = newFileSystemXmlApplicationContext ( "D:\\workspace\\spring\\spring_10_container\\src\\main\\resources\\applicationContext.xml" );
耦合度较高不推荐使用。
3BeanFactory来创建IOC容器
Resource resources = new ClassPathResource ( "applicationContext.xml" );BeanFactory bf = new XmlBeanFactory ( resources );BookDao bookDao = bf . getBean ( BookDao . class );bookDao . save ();
lazy-init = "true"
(二)bean的三种推荐方式:
1.BookDao bookDao = (BookDao) ctx.getBean("bookDao");
2BookDao bookDao = ctx.getBean("bookDao",BookDao.class);
3BookDao bookDao = ctx.getBean(BookDao.class);
(三)总结:
(四)注解配置:
删除配置文件中的bean对象
在源代码中加入@Component注解
@Component ( "bookDao" )public class BookDaoImpl implements BookDao {public void save () {System . out . println ( "book dao save ..." );}}
<context:component-scan base-package = "com.blue" />
@Component还衍生出来了@Controller@Service@Repository这三个注解。
这三个注解的作用是一样的,为了更加好的区分表现层,业务层和数据层的类。
都放在类定义的上方,就是为了将该类设为spring管理的bean。
(五)纯注解开发模式:
虽然上面已经用到了注解开发的形式,但依然存在配置文件。
在下面的方法中可以使用类来替换。
(一)具体的实现纯注解
步骤一:
创建一个配置类来替代那个配置文件
public class SpringConfig{
}
步骤二:
添加一个注解@Configuration,将其标识为一个配置类。
步骤三:
在配置类上添加包扫描注解@ComponentScan替换<context:component-scan base-package=""/>
@Configuration
@ComponentScan("com.blue")
public class SpringConfig{
}
这样就替代了配置文件
// 加载配置文件初始化容器ApplicationContext ctx = newClassPathXmlApplicationContext ( "applicationContext.xml" );// 加载配置类初始化容器ApplicationContext ctx = newAnnotationConfigApplicationContext ( SpringConfig . class );
(二)注解开发bean对象与生命周期
1.默认情况下产生的bean对象是单例的 如果在类上添加@scope则可以改变它的单例性质。
< dependency >< groupId > javax . annotation </ groupId >< artifactId > javax . annotation - api </ artifactId >< version > 1.3 . 2 </ version ></ dependency >
@Repository
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ...");
}
@PostConstruct //在构造方法之后执行,替换 init-method
public void init() {
System.out.println("init ...");
}
@PreDestroy //在销毁方法之前执行,替换 destroy-method
public void destroy() {
System.out.println("destroy ...");
}
}
(三)依赖注入:
1.选择按类型进行注入
在进行注入依赖的情况下,是使用的自动装配
@Servicepublic class BookServiceImpl implements BookService {@Autowiredprivate BookDao bookDao ;// public void setBookDao(BookDao bookDao) {// this.bookDao = bookDao;// }public void save () {System . out . println ( "book service save ..." );bookDao . save ();}}
2.按照名称进行注入:
@Servicepublic class BookServiceImpl implements BookService {@Autowired@Qualifier ( "bookDao1" )private BookDao bookDao ;public void save () {System . out . println ( "book service save ..." );bookDao . save ();}}
注意:@Qualifier不能独立使用,必须和@Autowired一起使用
简单类型的注入:
@Value ( "blue" )private String name ;
注意数据格式需要匹配好。
这样直接赋值没有什么太大意思。
resources下准备properties文件 创建一个文件jdbc.properties
@Configuration@ComponentScan ( "com.blue" )@PropertySource ( "jdbc.properties" )// @PropertySource ({ "jdbc.properties" , "xxx.properties" })public class SpringConfig {}
@Repository ( "bookDao" )public class BookDaoImpl implements BookDao {@Value ( "${name}" )private String name ;public void save () {System . out . println ( "book dao save ..." + name );}}
注意一下:propertyScource注解中不能够使用通配符,要不然就会报错。
3注解开发管理第三方bean
使用@Bean就可以实现直接bean的对象的创建
@Configuration
public class SpringConfig {
@Bean
public DataSource dataSource(){
DruidDataSource ds = new DruidDataSource();
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("jdbc:mysql://localhost:3306/spring_db");
ds.setUsername("root");
ds.setPassword("root");
return ds;
}
}
public class JdbcConfig {@Beanpublic DataSource dataSource (){DruidDataSource ds = new DruidDataSource ();ds . setDriverClassName ( "com.mysql.jdbc.Driver" );ds . setUrl ( "jdbc:mysql://localhost:3306/spring_db" );ds . setUsername ( "root" );ds . setPassword ( "root" );return ds ;}}
@Configuration//@ComponentScan("com.blue.config")@Import ({ JdbcConfig . class })public class SpringConfig {}
三Spring整合mybatis
导入依赖:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.10.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.16</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.47</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.2.10.RELEASE</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency> </dependencies>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--读取外部properties配置文件-->
<properties resource="jdbc.properties"></properties>
<!--别名扫描的包路径-->
<typeAliases>
<package name="com.blue.entity"/>
</typeAliases>
<!--数据源-->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}">
</property>
<property name="password" value="${jdbc.password}">
</property>
</dataSource>
</environment>
</environments>
<!--映射文件扫描包路径-->
<mappers>
<package name="com.blue.dao"></package>
</mappers>
</configuration>
接下来就是实现的具体方法:
1.创建好配置类:
public class JdbcConfig {@Value ( "${jdbc.driver}" )private String driver ;@Value ( "${jdbc.url}" )private String url ;@Value ( "${jdbc.username}" )private String userName ;@Value ( "${jdbc.password}" )private String password ;@Beanpublic DataSource dataSource (){DruidDataSource ds = new DruidDataSource ();ds . setDriverClassName ( driver );ds . setUrl ( url );ds . setUsername ( userName );ds . setPassword ( password );return ds ;}}
创建mybatis配置类并且配置sqlsessionfactory
public class MybatisConfig {// 定义 bean , SqlSessionFactoryBean ,用于产生 SqlSessionFactory 对象@Beanpublic SqlSessionFactoryBean sqlSessionFactory ( DataSource dataSource ){SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean ();// 设置模型类的别名扫描ssfb . setTypeAliasesPackage ( "com.blue.eneity" );// 设置数据源ssfb . setDataSource ( dataSource );return ssfb ;}// 定义 bean ,返回 MapperScannerConfigurer 对象@Beanpublic MapperScannerConfigurer mapperScannerConfigurer (){MapperScannerConfigurer msc = new MapperScannerConfigurer ();msc . setBasePackage ( "com.blue.dao" );return msc ;}}
主配置类
@Configuration@ComponentScan ( "com.blue" )@PropertySource ( "classpath:jdbc.properties" )@Import ({ JdbcConfig . class , MybatisConfig . class })public class SpringConfig {}
然后就可以去具体的运行了。
四:Spring整合Junit
其实核心,就是将spring中的那个容器弄进来就行,bean对象找到就行。
依赖
<dependency><groupId> junit </groupId><artifactId> junit </artifactId><version> 4.12 </version><scope> test </scope></dependency><dependency><groupId> org.springframework </groupId><artifactId> spring-test </artifactId><version> 5.2.10.RELEASE </version></dependency>
//设置类运行器
@RunWith(SpringJUnit4ClassRunner.class)
//设置Spring环境对应的配置类
@ContextConfiguration(classes = SpringConfig.class)
public class AccountServiceTest {
//支持自动装配注入bean
@Autowired
private AccountService accountService;
@Test
public void testFindById(){
System.out.println(accountService.findById(1));
}
@Test
public void testFindAll(){
System.out.println(accountService.findAll());
}
}
总结一下:
@Runwith就是放在测试类的上方,起到设置junit运行器的作用
@ContextConfiguration就是设置junit加载spring的核心配置。