Java_SSM_1

一、Java Beam及工厂模式

1、工厂模式

方式一:构造方法实例化bean

1
<bean id="bookDao”class="com.itheima.dao.impl.BookDaoImpl"/>

方式二:使用静态工厂实例化bean

1
<bean id="orderDao"class="com. itheima.factory.0rderDaoFactory" factory-method="getOrderDao"/>

方式三: 使用实例工厂实例化bean

1
2
<bean id="userFactory”class="com,itheima.factory.UserDaoFactory"/>
<bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>

方法四:FactoryBeam

1
<bean id="userDao" class="com.itheima.factory.UserDaoFactoryBean"/>

UserDaoFactoryBeam.java

1
2
3
4
5
6
7
8
9
10
11
12
13
public class UserDaoFactoryBean implements FactoryBean<UserDao> {
//代替原始实例工厂中创建对象的方法
public UserDao getObject() throws Exception {
return new UserDaoImpl();
}
public Class<?> getobjectType(){
return UserDao.class;
}
//是否单例
public boolean isSingleton() {
return true;
}
}

2.Beam生命周期

(1)

1
2
3
<!--Java中写 a.close();-->

<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl" init-method="init" destroy-method="destory"/>

(2)设置自动关闭

1
a.registerShutdownHook();

(3)一般不写,在Tomcat后关闭

1

3.依赖注入

1.Setter注入——简单类型

(1)在bean中定义引用类型属性并提供可访问的set方法

1
2
3
4
5
6
public class BookDaoImpl implements BookDao {
private int connectionNumber;
public void setConnectionNumber(int connectionNumber) {
this.connectionNumber = connectionNumber;
}
}

(2)配置中使用property标签value属性注入简单类型数据

1
2
3
<bean id="bookDao" class="com,itheima.dao.impl.BookDaoImpl">
<property name="connectionNumber” value="10"/>
</bean>

2.构造器注入

在bean中定义引用类型属性并提供可访问的构造方法

1
2
3
4
5
public class BookServiceImpl implements BookServicef
private BookDao bookDao;
public BookServiceImp1(BookDao bookDao) {
this.bookDao = bookDao;
}

配置中使用constructor-arg标签ref属性注入引用类型对象

1
2
3
4
<bean id="bookService”class="com,itheima,service,impl.BookServiceImpl">
<constructor-arg name="bookDao”ref="bookDao"/>
</bean>
<bean id="bookDao”class="com.itheima.dao.impl.BookDaoImpl"/>

配置中使用constructor-arg标签type属性设置按形参类型注入

1
2
3
4
<bean id="bookDao”class="com.itheima.dao.impl.BookDaoImpl">
<constructor-arg type="int" value="10"/>
<constructor-arg type="java.lang.String” value="mysql"/>
</bean>

配置中使用constructor-arg标签index属性设置按形参位置注入

1
2
3
4
<bean id="bookDao” class="com.itheima.dao.impl.BookDaoImpl">
<constructor-arg index="” value="10"/>
<constructor-arg index="1” value="mysql"/>
</bean>

依赖注入方式选择

  1. 强制依赖使用构造器进行,使用setter注入有概率不进行注入导致nu11对象出现
  2. 可选依赖使用setter注入进行,灵活性强
  3. Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨
  4. 如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入
  5. 实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入
  6. 自己开发的模块推荐使用setter注入

2

3.自动装配

IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配
自动装配方式:按类型( 常用 )、按名称、按构造方法、不启用自动装配

1
<bean id="bookServiceclass="com.itheima,service.impl.BookServiceImpl" autowire="byType"/>

依赖自动装配特征

  • 自动装配用于引用类型依赖注入,不能对简单类型进行操作
  • 使用按类型装配时( byType )必须保障容器中相同类型的bean唯一,推荐使用
  • 使用按名称装配时( byName )必须保障容器中具有指定名称的bean,因变量名与配置合,不推荐使用
  • 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效

注入集合:数组、List、Set、Map、Properties

Spring管理第三方资源案例

DruidDataSource
ComboPooledDataSource

1
2
3
4
5
6
7
8
9
10
11
12
13
<bean id="dataSource" class="com.alibaba,druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="ur1" value="jdbc:mysql://localhost:3306/spring db"/>
<property name="username" value="root"/>
<property name="password” value="root"/>
</bean>

<bean class="com.mchange.v2.c3pe.ComboPooledDataSource">
<property name="driverClass" value="com,mysql.jdbc.Driver"/>
<property name="jdbcUr1" value="jdbc:mysql://localhost;3306/spring_db"/>
<property name="user” value="root"/>
<property name="password” value="root"/>
</bean>

使用properties文件进行解耦管理

1.开启context而名空间

2.使用context空间加properties 文件

1
<context:property-placeholder location="jdbc.properties"/>

3.使用属性占位行${}读取properties 文件中的属性

1
2
3
4
5
6
7
8
9
10
<bean class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="ur1” value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password” value="${jdbc.password}"/>
</bean>

<bean id-"bookDaoclass="com.itheima.dao.impl.BookDaoImpl".
<property name="name” value="${jdbc.driver}"/>
</bean>

容器

1.创建容器

ClassPathXmlApplicationContext

FileSystemXmlApplicationContext

1
2
3
4
5
6
7
8
9
10
public class App {
public static void main(String[] args) {
//1.加载类路径下的配置文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.在文件系统下加载配置文件
ApplicationContext ctx = new FileSystemXmlApplicationContext configlocation: "D://aaa/applicationContext.xml"),
BookDao bookDao = (BookDao) ctxgetBean( s:"bookDao");
bookDao.save();
}
}

加载多个配置文件

1
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean1.xml", "bean2.xml");

2.获取bean (3种)

方式一: 使用bean名称获取

1
BookDao bookDao = (BookDao) ctx.getBean("bookDao");

方式二:使用bean名称获取并指定类型

1
BookDao bookDao = ctx.getBean("bookDao", BookDao.class);

方式三:使用bean类型获取

1
BookDao bookDao = ctx.getBean(BookDao.class);

3.容器类层次结构

3

4.BeanFactory

类路径加载配置文件

1
2
3
4
Resource resources = new ClassPathResource( "applicationContext,xml");
BeanFactory bf = new XmlBeanFactory(resources);
BookDao bookDao = bf.getBean("bookDao",BookDao.class);
bookDao .save();

BeanFactory创建完毕后,所有的bean均为延迟加载

总结

4

5

注解开发定义bean
使用@Component定义bean

1
2
3
4
5
6
@Component("bookDao")
public class BookDaoImpl implements BookDao {
}
@Component
public class BookServiceImpl implements BookService {
}

核心配置文件中通过组件扫描加载bean

1
<context:component-scan base-package="com.itheima"/>

纯注解开发


Java_SSM_1
https://davidpenn888.github.io/2023/11/30/Java-SSM-1-Beam/
作者
David Penn
发布于
2023年11月30日
许可协议