目录
初始化bean,判定bean对应的类中的方法是否匹配到任意切入点
1.IoC
“控制反转”,它不是一门技术,而是一种设计思想
-
开发人员通过 XML 配置文件、注解、Java 配置类等方式,对 Java 对象进行定义,例如在 XML 配置文件中使用 <bean> 标签、在 Java 类上使用 @Component 注解等。
-
Spring 启动时,IoC 容器会自动根据对象定义,将这些对象创建并管理起来。这些被 IoC 容器创建并管理的对象被称为 Spring Bean。
-
当我们想要使用某个 Bean 时,可以直接从 IoC 容器中获取(例如通过 ApplicationContext 的 getBean() 方法),而不需要手动通过代码(例如 new Obejct() 的方式)创建。
<!-- 配置bean(Ioc)--> <!--bean标签标示配置bean id属性表示给bean起名 class属性表示给bean定义类型--> <bean id="bookDao" class="dao.impl.BookDaoImpl"/>
2.DI
依赖注入,
在面向对象中,对象和对象之间是存在一种叫做“依赖”的关系
<!--配置service和dao之间的关系(DI)--> <!--property标签表示配置当前bean的属性 name属性表示配置的bean的具体属性 ref表示参照哪一个bean--> <bean id="bookService" class="service.impl.BookServiceImpl"> <property name="bookDao" ref="bookDao"/> </bean>
3.实例化bean---构造方法
有实例类BookServiceImpl
<bean id="bookService" class="service.impl.BookServiceImpl"/>
4.实例化bean---静态工厂
有一工厂类,方法为静态
public class BookFactory { public static BookDao getBookDao() { return new BookDaoImpl(); } }
使用静态工厂实例化bean
<!-- 静态工厂实例化bean--> <bean id="bookDao" class="factory.BookFactory" factory-method="getBookDao"/>
5.实例化bean---实例工厂
工厂类的方法非静态 需要实例化工厂类再调用其中的方法
public class BookFactory1 { public BookDao getBookDao() { return new BookDaoImpl(); } }
<!-- 实例工厂实例化bean--> <bean id="bookFactory1" class="factory.BookFactory1"/> <bean id="bookDao" factory-bean="bookFactory1" factory-method="getBookDao"/>
6.bean的生命周期
-
实例化->Instantiation
-
属性赋值->Populate
-
初始化->Initialization
-
销毁->Destruction
销毁前需要关闭容器或者关闭钩子ctx.close
7.setter注入
<property>标签提供setter注入 name表示属性名 ref表示饮用类型 value表示简单类型
<bean id="bookService" class="service.impl.BookServiceImpl"> <property name="bookDao" ref="bookDao"/> <property name="name" value="英俊"/> <property name="num" value="23"/> </bean>
8.构造器注入
<bean id="bookService" class="service.impl.BookServiceImpl"> <constructor-arg name="bookDao" ref="bookDao"/> <constructor-arg name="name" value="英俊"/> <constructor-arg name="num" value="23"/> </bean>
name-->表示实例类构造器中的形参
9.自动装配(普通和注解)
系统自动在配置文件中查找对应的bean
推荐使用按类型
<只能>对应用类型进行操作 <不能>对简单类型进行操作
自动装配的优先级低于setter注入和构造器注入,同时使用会出现自动装配失败
1.按类型
<bean id="bookService" class="service.impl.BookServiceImpl" autowire="byType"/>
注意:1.实例类中必须含有对应类型的构造方法
2.配置文件中必须含有对应的类型的bean 且含有唯一一个
3.实例类中不能含有构造方法
4.要查找bean 可以不取id
2.按名称
<bean id="bookService" class="service.impl.BookServiceImpl" autowire="byName"/>
注意:1.实例类中必须含有对应类型的构造方法
2.配置文件中可以有两个以上类型相同的bean 但是bean的id必须和实例类中的属性名一致
4.注解开发自动装配
引用类型
基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据
在实例类中注入对象----
使用@Autowired 会根据类型 自动为实例类注入对象 可以不需要set方法
若需要注入的bean有多个相同类型的实例类
1.使用id注入 在其他实例类注解后加入id
2.使用@Qualifiter("实例类注解的id") 必须依赖@Autowired
简单类型
在普通变量上面加@Value(注入值)
从配置文件中载入注入值
使用@Propertysource("文件包路径")导入文件资源 不支持使用通配符*
若引入多个文件 @Propertysource{}("文件包路径1","文件包路径2"})
@Value("${}")使用${}占位符载入注入值
10.集合注入
依赖set方法
<bean id="bookDao" class="dao.impl.BookDaoImpl"> <property name="与实例类属性名对应"> <array> <value>100</value> </array> </property> </bean>
list和array可以混用
array注入
注入普通类型
<property name="array"> <array> <value>100</value> </array> </property>
注入应用类型 用<ref>单标签 bean中存放bean的id
<ref bean="bean的id"/>
list注入
和array数组可以替换<list>==<array>
<property name="list"> <list> <value>吕布</value> </list> </property>
set注入
<value>中同样内容不会重复保存
<property name="set"> <set> <value>wudi</value> </set> </property>
map注入
在<entry>标签内部存放key值和value值
<property name="map"> <map> <entry key="1" value="一"/> </map> </property>
properties注入
与其他不同 使用<prop>标签存放内容 key值在内 value在外
<property name="properties"> <props> <prop key="1">一</prop> </props> </property>
11.数据源对象管理(第三方bean)(注解开发)
bean标签开发第三方bean
先在pom.xml中导入依赖
c3p0对象管理则需要导入mysql依赖 (druid 攘括mysql)
<bean id="DateSources" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql///springtest1"/> <property name="username" value="root"/> <property name="password" value="000927"/> </bean>
注解开发第三方bean
使用独立的配置类管理第三方bean
public class jdbcConfig { @Bean public DataSource dataSource() {