文章目录
说明
- 仅仅是把以前的比较归类存档,不具备太大的参考价值
- 而且是历史内容,可能出现过时能信息,
- 主要参考 https://docs.spring.io/spring/docs/5.2.6.RELEASE/spring-framework-reference/core.html#beans-introduction
XML和注解结合方式
- 这个是早期具体哪个版本不记得,需要在application.xml开启元注解才可以使用@Component…等注解
- 开启扫描
- 配置扫描那些包
自动装配配置
- 注解方式开启IOC
<!-- 开启spring注解-->
<!-- 自动装配,扫描cn.lwb包下的注解-->
<context:component-scan base-package="cn.lwb" />
<!-- 开启spring注解 这个功能较弱-->
<context:annotation-config />
- 自动扫描装配
<!-- 配置扫描所有 -->
<context:component-scan base-package="vip.xjdai.ioc.cc"/>
<!-- 配置扫描 cc -->
<context:component-scan base-package="vip.xjdai.ioc.cc">
<!-- 排除Service,除了service都会扫描 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />
</context:component-scan>
<!-- 配置扫描 aa和bb -->
<context:component-scan base-package="vip.xjdai.ioc.aa,vip.xjdai.ioc.bb" use-default-filters="false">
<!-- 配置仅扫描Service -->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service" />
</context:component-scan>
<!-- use-default-filters="false" 默认值是true
如果配置了就仅仅扫描@Controller,
如果不配置则会扫描@Component, @Repository, @Service等注解
-->
<context:component-scan base-package="vip.xjdai.ioc.controller" use-default-filters="false">
<!-- 配置只扫描@Controller注解 -->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
注解使用
@Component 表示当前类是配置类
@Controller 用于表现层的注解
@Service 用于业务层的注解
@Repository 用于持久层的注解
- 注解属性 value 指定bean的id。如果不指定value属性,默认bean的id是当前类的类名。首字母小写。
生命周期
-
简单说就是对象在spring容器(IOC容器)中的生命周期,也可以理解为对象在spring容器中的创建方式。
-
@Scope
- prototype :表示多例
- singleton:表示单例(默认值)
- request
- session
DI注入
-
需要IOC环境,spring创建这个类的过程中。
- spring将类的依赖的属性设置进去,把依赖的属性往注入到对象中。
-
泛型注入
- 如果是泛型注入的话只能用@Autowired
- 泛型注入是spring4的新特性
形参注入
-
@Qualifier(“cat1”) –例子暂定
- 定义在形参内, 用于获取spring容器中的对象
对象注入
-
@Autowired
- 在容器中获取一个类型相同的进行注入,自动按照类型注入。当使用注解注入属性时,set方法可以省略。它只能注入其他bean类型。当有多个类型匹配时,使用要注入的对象变量名称作为bean的id,在spring容器查找,找到了也可以注入成功。找不到就报错。
-
@Resource(name = “容器中name值”)
- 直接按照Bean的id注入。它只能注入其他bean类型。如果该接口只有一个实现类,则不需要指定手动指定将,那个对象装入属性中
-
@Autowired
-
@Qualifier(“cat1”)
- 在自动按照类型注入的基础之上,再按照Bean的id注入。它不能独立使用,必须和@Autowire一起使用。多相同的对象,指定容器中某一个自动匹配,spring,会自动查找容器中类型符合的对象,注入到属性当中
XML 纯配置
- XML 配置是纯XML的配置,不依托于
@注解
的方式
XML-注入bean
- 通过简单的配置,就可以将一个类的对象创建交给class管理
<bean name="标示 " class="当前类地址" />
XML-静态注入
- 静态注入指的是静态属性的注入
<bean id="dsForRW" class="cn.lwb.controller.AdvancedDatastore" />
<!--
init-method='init' 用于指定那个方法是初始化方法,将在对象创建之后调用
-->
<bean id="mongoFileOperationUtil" class="cn.lwb.controller.MongoFileOperationUtil" init-method="init">
<property name="dsForRW" ref="dsForRW" />
</bean>
- java 配置
public class MongoFileOperationUtil {
private static AdvancedDatastore dsForRW;
private static MongoFileOperationUtil mongoFileOperationUtil;
public void init() {
mongoFileOperationUtil = this;
mongoFileOperationUtil.dsForRW = this.dsForRW;
}
public AdvancedDatastore getDsForRW() {
return dsForRW;
}
public void setDsForRW(AdvancedDatastore dsForRW) {
MongoFileOperationUtil.dsForRW = dsForRW;
}
public MongoFileOperationUtil getMongoFileOperationUtil() {
return mongoFileOperationUtil;
}
public void setMongoFileOperationUtil(MongoFileOperationUtil mongoFileOperationUtil) {
MongoFileOperationUtil.mongoFileOperationUtil = mongoFileOperationUtil;
}
}
public class AdvancedDatastore {
public static String getStringNaem() {
return "你好";
}
}
静态工厂注入
- 根据构造方法的方式 静态工厂方式
<!--配置bean,配置后该类由spring管理 -->
<bean name="springAction2" class="cn.lwb.static_factory_di.SpringAction">
<!--(3)使用静态工厂的方法注入对象,对应下面的配置文件(3) -->
<property name="staticFactoryDao" ref="staticFactoryDao"></property>
</bean>
<!--(3)此处获取对象的方式是从工厂类中获取静态方法 -->
<bean name="staticFactoryDao" class="cn.lwb.static_factory_di.DaoFactory" factory-method="getStaticFactoryDaoImpl"></bean>
- 生成对象的静态工厂
public class DaoFactory {
//静态工厂
public static final FactoryDao getStaticFactoryDaoImpl() {
return new StaticFacotryDaoImpl();
}
}
- 需要生产的对象
public interface FactoryDao {
public void saveFactory();
}
// 这个是一个实现类
public class StaticFacotryDaoImpl implements FactoryDao {
@Override
public void saveFactory() {
System.out.println("我是一个对象"+this);
}
}
- 进行注入
public class SpringAction {
//注入对象
private FactoryDao staticFactoryDao;
public void staticFactoryOk() {
staticFactoryDao.saveFactory();
}
//注入对象的set方法
public void setStaticFactoryDao(FactoryDao staticFactoryDao) {
this.staticFactoryDao = staticFactoryDao;
}
}
XML配置Bean一些标签属性
- id
- 给对象在容器提供一个唯一表示,与name功能一模一样.
- 唯一性,如果ID 相同则覆盖
- name
- 给容器中的对象起个名字,在获得对象时根据对象名字获取对象
- class
- 需要被管理的类的全限定类名
- scope
- 表示声明周期
- singleton:单例(默认每次启动容器时,对象就被创建只要容器在就存在容器关闭才会销毁
- prototype:多例启动容器时,不会创建多例对象,每次获得对象时,都会创建新的对象当对象长时间不用时,被java的垃圾回收器回收了
- request: web环境下,容器中与当前request同生命周期
- session: web环境下,容器中与当前session同生命周期
- destroy-method
- 用于指定那个方法是销毁.将在对象销毁之前调用
XML-使用set方式进行注入
- 对象,属性使用set方式注入
<bean id="userService" class="cn.lwb.User">
<!-- 回去调用set方法,然后注入一个属性-->
<property name="name" value="小明" />
<!-- 回去调用set方法,然后注入一个属性-->
<property name="customer" ref="customerDao" />
</bean>
<bean id="customerDao" class="cn.lwb.CustomerDao" />
name :属性的参数
ref :能赋的值是其他bean类型,必须得是在容器(spring)中配置过的bean
- java
class UserService {
private String anem;
private CustomerDao customerDao;
public void setAnem(String anem) {
this.anem = anem;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
public void isOK(){
customerDao.isOk();
}
}
构造函数方式对象、属性赋值
- 使用构造函数的方式进行对象属性赋值,如果设置角标,则必须按照角标的顺序,否则保存失败
<bean id="标识符" class="全限定类名">
<constructor-arg index="2" name="属性" ref="引用" />
<constructor-arg index="1" name="属性" value="值" />
<constructor-arg index="0" name="属性" value="值" />
</bean>
<bean name="标识符" class="全限定类名"></bean>
index:
name :属性的参数
ref :能赋的值是其他bean类型,必须得是在容器(spring)中配置过的beanvalue:对应属性的值
type:指定参数在构造函数中的数据类型
- 如果没有角标可以不用考虑
<bean id="标识符" class="全限定类名">
<constructor-arg name="属性" ref="引用" />
<constructor-arg name="属性" value="值" />
<constructor-arg name="属性" value="值" />
</bean>
<bean name="标识符" class="全限定类名"></bean>
数组参数注入
- 在注入集合数据时,只要结构相同,标签可以互换
- 给数组注入数据
- 给Bean属性赋值
<bean id="user" class="cn.lwb.com.User">
<!-- 给User类中的set这个属性创建的时候初始化一个AAA的值-->
<property name="set">
<set>
<value>AAA</value>
</set>
</property>
<property name="array">
<set>
<value>AAA</value>
</set>
</property>
<property name="list">
<set>
<value>AAA</value>
</set>
</property>
<bean>
命名空间注入方式
- 基本不用,有这种方式,真的需要还是去百度吧