文章目录
Spring Framework(Spring框架)
EJB思想(企业级javaBean)–>Spring1.0(通过配置文件的方式管理bean)–>Spring3.0注解成熟–>Spring5.0只支持java1.8以上
core Container(核心容器)
- bean
- Core
- Context
- Expression Language
所需要的jar包
导入依赖
Spring核心
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
它包含的jar包有
IOC(控制反转)
通过IOC对程序的bean进行创建消除,而不是自己new
IOC容器
容器接口实现类过程
上层接口:
加载容器的方式:
1.通过类路径下的方式进行加载
2.通过文件系统的位置进行加载
//注意第二个通过文件位置这里需要填写的为本地全路径,耦合高不建议使用
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext2.xml");
ApplicationContext ctx2 = new FileSystemXmlApplicationContext("D:\\000JavaAbout\\workplace\\Spring_Use\\src\\main\\resources\\applicationContext.xml");
bean
创建bean的方式
- 通过容器获取
//获取容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContextuse.xml");
//获取bean 第一个是通过id,第二个是指定出引用类型,第三是按类型获取bean
BookService bookService = (BookService) ctx.getBean("bookServiceImpl");
BookService bookService1 = ctx.getBean("bookServiceImpl", BookServiceImpl.class);
BookService bookService2 = ctx.getBean(BookServiceImpl.class);
- 通过静态工厂获取bean
//在静态工厂中定义一个获取bean的方法
public static BookDaoImpl getBookDao(){
return new BookDaoImpl();
}
//xml中定义一个工厂 ,指定工厂的方法
<bean id="factroy" class="cn.dao.factory.BookStaticDaoFactory" factory-method="getBookDao">
// 调用工厂获取实例化对象
BookDao bookDao= (BookDao) ctx.getBean("factory"); //这里获取的bean是xml中的id值
//调用实例化对象方法
bookDao.save();
- 实例化工厂
//通过实现factorybean配置标准化工厂
public class BookDaoFactoryBean implements FactoryBean<BookDao> {
@Override
public BookDao getObject() throws Exception {
return new BookDaoImpl();
}
@Override
public Class<?> getObjectType() {
return BookDao.class;
}
}
//xml配置
<bean id="FactoryBean" class="cn.dao.factory.BookDaoFactoryBean" />
//调用
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext1.xml");
//获取实例化对象
BookDao v = (BookDao) ctx.getBean("FactoryBean"); //这里获取的bean是xml中的id值
//调用实例化对象方法
v.save();
bean DI的标签
<!--id为bean的唯一标识 name为bean的别名,scope用来指定是否为单例,默认为单例模式,class用来指定哪个类 lazy-init是否进行懒加载,在需要getbean()时才会进行加载,而不是容器初始化的时候-->
<bean id="bookServiceImpl" name="bookDaoImpl1,bookDaoImpl2" scope="singleton"
class="cn.service.impl.BookServiceImpl" init-method="afterPropertiesSet"
destroy-method="destroy" lazy-init="true"
>
<!-- 属性中可以是引用类型,集合,不能是基本数据类型(可以使用包装类)都是通过setter注入的方式-->
<!-- 这里是String类型,这里的name需要和变量名相同,value实行赋值-->
<property name="conn" value="com.jdbc.connection" ></property>
<!--这里传入的是一个成员bean类型 ref是指向当前容器中的哪个bean-->
<property name="bookDao" ref="bookDaoImpl"/>
<!-- 这里传入的是集合类型-->
<property name="arrays">
<array>
<value>a</value>
<value>aa</value>
<value>aaa</value>
<value>aaaa</value>
</array>
</property>
<property name="maps">
<map>
<entry key="map" value=""/>
<entry key="map" value=""/>
<entry key="map" value=""/>
<entry key="map" value=""/>
</map>
</property>
</bean>
<bean class="cn.service.impl.BookServiceImpl" >
<!-- 构造器进行传引用类型 name为形参的名称,这里耦合度比较高 ,可以通过type解耦 当两个type相同时,可以通过index表示形参位置-->
<constructor-arg name="bookDao" ref="bookDaoImpl"/>
</bean>
通过properties文件给bean属性赋值${}
- 首先需要开启命名空间
- 然后扫描文件位置
- 使用${}进行value赋值
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/students
jdbc.username=root
jdbc.password=root
xmlns:context="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-beans.xsd
<!-- 系统属性值读取不开, location值可以加载多个-->
<context:property-placeholder location="jdbc.properties" system-properties-mode="NEVER"/>
<!-- 这里第一个*代表可以读取项目外导入的jar包中的文件,第二个*代表扫描项目下src下和resources下全部的properties文件-->
<context:property-placeholder location="classpath*:*.properties" system-properties-mode="NEVER"/>
<!--通过${}进行value值进行赋值-->
<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>