配置文件介绍
bean标签解析
bean标签:指定创建的实体类
id属性:可以为任意值
class属性:要实例化类的全限定名
ApplicationContext context = new ClassPathXmlApplicationContext();
User user = (User)context.getBean("abc");
scope属性:singleton 单实例 ,如果是单实例配置文件一家在就会创建对象,放在spring容器中,以map形式存储,map id是key,value是他的对象,默认情况下配置文件只要一加载 就创建对象 scope:singleton
prototype 多实例,如果是多实例,配置文件加载,不会创建对象,当每个人getBean时候创建对象,get一次创建一次。
什么时候用单实例,什么时候用多实例:action:prototype
service/dao:singleton
single对象什么时候销毁?
答:single对象一般不销毁,当容器关闭。prototype的对象长时间不用就被jvm自动回收。
init-method:指定初始化时机
destory:死指定销毁方法。
导入外部配置文件
bean创建的是三种方式
无参数构造方式
静态工厂创建方式
条件:需要有个工厂类,还需要有个静态方法,
public class BeanFactory{
public static User createUser(){
return new User();
}
}//静态方法负责创建对象
实例工厂
条件:需要有一个工厂类,在这个工厂类中还需要有一个普通方法。
public class BeanFactory{
public static User createUser(){
return new User();
}
public User createUser(){
return new User();
}
}//静态方法负责创建对象
DI属性注入方式
第一种方式:构造器方式注入
要构造的类中有构造器方法
第二种方式:set属性注入
class car implements carimpl(){
string name ;
integer price;
getter and setter方法
}
第三种方式:p命名空间方法(了解)
第四种复杂属性注入:复杂类型
aaa
bbb
ccc
aaa
BBB
ccc
root
123
以后代替properties文件
springAPI内容
ioc的AIP内容
ApplicationContext:接口
2个常用的实现类: ClassPathXmlApplicationContext -------> 从src下加载配置文件
FileSystemXmlApplicationContext ------->从磁盘路径下加载配置文IOC注解开发
spring注解开发
spring整合连接池
spring不仅可以实例化自己写的类也可以实现第三方的类。例如c3p0硬编码连接池。
public void test1() throws Exception //c3p0
{
ComboPooledDataSource dataSource=new ComboPooledDataSource(); //IOC
// 设置驱动
dataSource.setDriverClass("com.mysql.jdbc.Driver");
// 设置地址
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/hibernate");
// 设置用户名
dataSource.setUser("root");
// 设置密码
dataSource.setPassword("1234"); //DI
// 问连接池要连接对象
Connection con = dataSource.getConnection();
System.out.println(con);
}
既然是创建对象并初始化,那么将这个过程交给spring管理,用context的名称空间和约束条件可以加载properties文件。
//properties文件
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/hibernate
jdbc.username=root
jdbc.password=1234
#jdbc.driver=com.mysql.jdbc.Driver
#jdbc.url=jdbc:oracle://localhost:3306/hibernate
#jdbc.username=root
#jdbc.password=1234
#jdbc.driver=com.mysql.jdbc.Driver
#jdbc.url=jdbc:db2://localhost:3306/hibernate
#jdbc.username=root
#jdbc.password=1234
properties文件用来切换数据库,导入expression包就可以使用cgnil表达式
!-- 让spring能够加载jdbc.properties文件
spring提供了一个标签 可以加载外部的properties文件内容
导context的名称空间和约束 才会有提示
-->
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
spring的IOC注解
帮助解半xml配置方式
自己的类全部是注解
别人的类全部都是xml
1 导包 spring-aop.jar
2 配置注解扫描器
!-- 让spring能够加载jdbc.properties文件
spring提供了一个标签 可以加载外部的properties文件内容
导context的名称空间和约束 才会有提示
-->
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------
---------------------------------------------------
在类上面打注解@service("service")相当于在xml文件中写
@scope("prototype") //多例
@Service("userService")
public class UserServiceImpl implements UserService
{
@Value("要开始访问dao了")
private String name;
//@Autowired // 自动去spring容器中找有没有该类型(UserDao)的实例对象 如果有直接赋值
//@Qualifier("userDaoxxx") // 指定用该类型的哪个名称的实例对象
@Resource(name="id")//写括号就是名称指定,不写就是类型指定
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void save()
{
System.out.println(name);
// 调用dao
userDao.save();
}
-------------------对象初始化方法,类销毁执行的方法------------------------------------------------
// 初始化方法
@PostConstruct
public void init()
{
System.out.println("userService的初始化方法....");
}
// 销毁的方法
@PreDestroy
public void destory()
{
System.out.println("userService的销毁方法....");
}
}
@component("bean的ID") 只要注解扫描器扫描到注解就会在spring中创建对象。
新注解/完全注解配置
条件:需要有一个注解类,不再加载配置文件,而是加载这个注解类。
@Configuration // 表示该类是一个注解类
@ComponentScan(basePackages="cn.itcast") //
@PropertySource(value="classpath:jdbc.properties")//
@Import(value = {DataSourceconfig.class})
public class SpringConfig
{
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
// 自己创建c3p0连接池 给spring容器
@Bean(name="c3p0") //
public DataSource createDataSourceC3p0() throws Exception
{
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass(driver);
ds.setJdbcUrl(url);
ds.setUser(username);
ds.setPassword(password);
return ds;
}
// 4.3以前 要给spring配置一个解析器 来解析 ${}
@Bean
public static PropertySourcesPlaceholderConfigurer createPropertySourcesPlaceholderConfigurer()
{
return new PropertySourcesPlaceholderConfigurer();
}
或者在另外一个文件创建配置类然后导进另一个类里面。@value()给字段注入值,@bean
public class DataSourceconfig
{
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
// 自己创建c3p0连接池 给spring容器
@Bean(name="c3p0") // //返回的是一个引用类型
public DataSource createDataSourceC3p0() throws Exception
{
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass(driver);
ds.setJdbcUrl(url);
ds.setUser(username);
ds.setPassword(password);
return ds;
}
// 4.3以前 要给spring配置一个解析器 来解析 ${}
@Bean
public static PropertySourcesPlaceholderConfigurer createPropertySourcesPlaceholderConfigurer()
{
return new PropertySourcesPlaceholderConfigurer();
}
}
---------------------------------------------------------------------------------------------------
public class SpringConfigTest
{
@Test
public void test() throws SQLException
{
// 加载注解类
ApplicationContext context=new AnnotationConfigApplicationContext(SpringConfig.class);
/* UserService userService=(UserService)context.getBean("userService");
userService.save();*/
DataSource ds =(DataSource)context.getBean("c3p0");
Connection con = ds.getConnection();
System.out.println(con);
}
}
spring整合junit测试
1 导包 spring-test.jar 增强 spring-aop.jar 可以写注解 junit.jar 还是之前的测试
2 要告诉spring谁加载配置文件(SpringJunt4ClassRunner.class)
3 要告诉spring配置文件的地址
4 分层测试
/*1:告诉spring配置文件在哪个地方*/
@ContextConfiguration(value="classpath:applicationContext.xml")
/*2:告诉spring谁加载配置文件*/
@RunWith(value =SpringJUnit4ClassRunner.class)
public class SpringJunit
{
@Autowired
private UserService userSerive;
@Autowired
private UserDao userDao;
@Test
public void test1()
{
userDao.save();
}
}
可以实现分层测试