1.Spring依存性注入
1.1春は何ですか
これは、軽量コンテナフレームとIOC(DI)とAOPであります
IOC:私たち自身の新しいオブジェクトにするために使用制御の反転は今豆の道を作成し、春を作成するために私たちを支援することです
DI:これは、依存性注入コンテナフレームの後にバネであるビーン(ロードオブジェクト)コンテナフレームである、私は良好なオブジェクトを作成するためのバネ、我々は、プロセスの中に注入され、対応するクラスの良いオブジェクトを作成します
AOP:アスペクト指向プログラミング
AOP使用シナリオ:
トランザクション管理
ログ管理
パフォーマンス・コントロール
DI DI 1.2スプリング
注入の1.2.1設定方法(初め)
前
applicationContext.xmlを設定は、セット方法でパス内に作成されたクラスオブジェクトにクラスの完全修飾名で見つかった
<ビーンID =「UserServiceの」クラス =「... UserServiceImpl」>
UserController{
private UserService userService;
// 默认就是 通过set属性传值
void setUserService(UserService userService){
this.userServicer = userService;
}
}
1.2.2コンストラクタ・インジェクション
インデックスindex注入
注意value 值对应类型 索引从0开始
<constructor-arg index="0" value="123"></constructor-arg>
注入された名前のパラメータ名
<constructor-arg name="id" value="456"></constructor-arg>
型インジェクションタイプ
若是有多个相同的类型 依次添加值即可
<constructor-arg type="java.lang.Long" value="111"></constructor-arg>
これは、注射1.2.3クラスのプロパティ
属性注入: 最常用就是基本类型和引用类型注入
//基本数据类型注入
<property name="id" value="111"></property>
<property name="name" value="康康"></property>
// ref 引用一个对象
<property name="hellobean" ref="hb"></property>
<property name="hellobean">
//直接注入一个对象
<bean class="xxxx"></bean>
</property>
<!-- 数组注入方式1 属性注入底层还是使用的set方法-->
<property name="strings" value="A,B,B,B"></property
<!-- 数组注入方法二-->
<property name="strings">
<array >
<value>是尼玛 </value>
<value>是我</value>
</array>
</property>
<!-- 集合注入方法-->
<property name="list">
<list>
<value>你让我说点啥好</value>
<value>你让我说点啥好</value>
<!--创建的对象 每次都是不同的对象-->
<bean class="_01_di.cn.itsource.HelloBean"></bean>
<bean class="_01_di.cn.itsource.HelloBean"></bean>
<!-- 引用的两个地址是一样的 -->
<ref bean="hello"></ref>
<ref bean="hello"></ref>
</list>
<!-- 集合注入方法 set-->
<property name="set">
<set>
<value>小胡</value>
<value>小胡</value>
// 注入一个bean对象 注入的对象地址都是不同的
<bean class="_01_di.cn.itsource.HelloBean"></bean>
<bean class="_01_di.cn.itsource.HelloBean"></bean>
// 引用的地址是一样的
<ref bean="hello"></ref>
<ref bean="hello"></ref>
</set>
<!-- map传值-->
<property name="hp">
<map>
<entry key="小胡" value="小幸福"></entry>
<entry key="小长" value="陆小凤"></entry>
</map>
</property>
注入properties
// 不支持中文
<property name="prop1">
<value>
driverClassName=com.mysql.jdbc.Driver
username=qiang强
</value>
</property>
<property name="prop2">
//支持中文
<props>
<prop key="driverClassName">com.mysql.jdbc.Driver</prop>
<prop key="username">qiang强</prop>
</props>
</property>
1.3自動注入のXMLバージョン
自動的に名前によって注入- CAN BYNAME
またはbyType注入-自動注射器の種類(デフォルトはbytypeである)に応じて
、ルート豆デフォルト-autowire =「BYNAME」豆現在のすべての構成ファイルが有効になる
子供は、現在のBean autowire =「byTypeを」ノード力に豆
私たちは別のBeanへのBeanを注入する必要がある場合は、実際には、またのSpring Beanをサポートしているsetメソッドまたはコンストラクタ通常を注入することにより、自動的に注入されて実施されています。あなたがBeanを定義するとき、私たちは、あなたが自動的に豆autowireプロパティ要素によって、それに関連するBeanへの現在のBean注入するかどうかを指定することができます。オプションの値autowireは、4つの属性があります。
- いいえ:デフォルト。それは何の自動注入を意味しません。
- BYNAME:名前による自動注入。特定beanA setBeanB()メソッドなどの場合autowire =「BYNAME」春を自動的setBeanB beanA法による自動注射に豆容器に「beanB」と呼ばれる豆を求めています。
- byType:タイプに従って自動注入。BeanA setBeanB(BeanB B)の方法として、beanA注入するautowire =ビーンsetBeanB()メソッドの「byType」春豆容器が自動的BeanBタイプを指定します。BeanコンテナのBeanBケースの2種類以上が存在する場合しかし、それは例外がスローされます。あなたは注入する名前を使用することができるときBAENの同じ種類を解決するための二つの方法がある場合
- コンストラクタ:byTypeに相当する、指定されたautowireは=自動的に入力すると、「コンストラクタ」に従って示す工法を通じて注入された場合を除いて。
詳細なXML
<bean id="userController" class="_02_autoxml.cn.itsource.UserController" autowire="byType">
<!--<property name="userService" ref="service"></property>-->
</bean>
<bean id="userDao" class="_02_autoxml.cn.itsource.UserDao"></bean>
<bean id="userService" class="_02_autoxml.cn.itsource.UserServiceImpl">
<!-- <property name="userDao" ref="dao"></property>-->
</bean>
ノートバージョン1.4 XMLインジェクション
扫描包路径 扫描注解:
@Component 普通类上面打的注解(普通仓库), @Repository, @Service,@Controller
<context:component-scan base-package="_03_annoxml.cn.itsource"></context:component-scan>
インターフェースは、ケースの2つの実装を持っている場合:
方案一:一个接口有多个实现的情况下面 通过名字去区分
方案二:通过Resource这个注解
区别:@Autowired和@Qualifier 都是属于spring的注解 ,
Resource使用jdk的注解 推荐使用Autowired和Qualifier,可以和spring进行无缝衔接
autowired默认是根据类型匹配,如果类型匹配不上在根据名字匹配
而Resource默认根据名字匹配,名字匹配不上就匹配类型
2春AOPは、内部の特徴
2.1 springAOP何ですか
AOP:の指向プログラミングセクション
AOPうちOOP(オブジェクト指向プログラミング)を交換しないように、それはいくつかの(または非常に困難を解決するために)することはできません私たちの決意のOOP(オブジェクト指向)のいくつかを解決するための補完としての役割を超えていますコード。
AOPの使用が(クロスカッティングロジック・アプリケーションで)特定の状況でのみ存在する、論理的な説明の断面は、より抽象的であってもよいし、我々はもう少し具体的に言えば、AOPは、トランザクション管理、ログ管理、パフォーマンスの監視、他の場所で使用することができます。
2.2aop実装
プロキシモードでは、基礎となるAOPを実現しています
プロキシモードをjdk - インタフェースケースと
CGLIBの動的プロキシ - ないインタフェースケース
2.3 springaop構成
コンフィギュレーションのXMLバージョン
// 扫描主键
<context:component-scan base-package="_04_aopxml"></context:component-scan>
<aop:config>
// 在哪里切入
<aop:pointcut id="pointcut" expression="execution(* _04_aopxml.I*Service.*(..))"></aop:pointcut>
<!--配置通知 引用事务管理-->
<aop:aspect ref="txManager">
<!-- 前置通知-->
<!--<aop:before method="begin" pointcut-ref="pointcut"></aop:before>
<!– 后置通知–>
<aop:after-returning method="commit" pointcut-ref="pointcut"></aop:after-returning>
<!– 最终通知–>
<aop:after method="close" pointcut-ref="pointcut"></aop:after>
<!– 异常通知–>
<aop:after-throwing method="rollback" throwing="e" pointcut-ref="pointcut"></aop:after-throwing>-->
<!-- 环绕通知-->
<aop:around method="around" pointcut-ref="pointcut"></aop:around>
</aop:aspect>
</aop:config>
<bean id="txManager" class="_04_aopxml.TxManager"></bean>
コンフィギュレーションの注釈付きバージョン
@Component
@Aspect
public class TxManager {
// 在哪里切入 执行
@Pointcut("execution(* _05_aopanno.I*Service.*(..))")
//切入点
public void pointcut(){}
//<aop:before method="begin" pointcut-ref="pointcut"></aop:before>
//@Before("pointcut()")
public void begin(){
System.out.println("开启事务");
}
/// @After("pointcut()")
public void commit(){
System.out.println("提交事务");
}
//@AfterReturning("pointcut()")
public void close(){
System.out.println("关闭");
}
//所有的异常的父类
// @AfterThrowing(value = "pointcut()",throwing = "e")
public void rollback(Throwable e){
System.out.println("回滚事务"+e.getMessage());
}
//环绕通知
@Around("pointcut()")
public void around(ProceedingJoinPoint joinPoint){
try {
begin();
//调用方法
joinPoint.proceed();
commit();
} catch (Throwable throwable) {
throwable.printStackTrace();
}finally{
close();
}
}
}
3 Beanの道を作成します
前モデル:経由で新しいオブジェクトを作成
春のファッション:私たちは豆の作成を支援するために、スプリング。 - 豆の道を作成します。
3.1 Beanの道を作成
最も一般的な方法 - 引数のないコンストラクタによってBeanを作成するには
コンフィギュレーション
<bean id="mybean" class="_06_bean.Mybean"></bean>
3.2 Beanを作成する2番目の方法
FactoryBeanのファクトリオブジェクト
//实现 FactoryBean
public class MybeanFactoryBean implements FactoryBean<Mybean> {
//返回对象
public Mybean getObject() throws Exception {
return new Mybean("xxx", "18");
}
public Class<?> getObjectType() {
return Mybean.class;
}
//是否单例
public boolean isSingleton() {
return true;
}
}
3.3 Beanを作成するには、3つの方法
静的メソッドを定義Beanクラスを得るために
public class MybeanFactory {
public static Mybean getBean(){
return new Mybean();
}
}
<bean class="_06_bean.MybeanFactory" factory-method="getBean"></bean>
3.4 Beanを作成するには4つの方法
public class MybeanFactory1 {
//普通方式
public Mybean getBean1(){
return new Mybean();
}
}
<bean class="_06_bean.MybeanFactory1" id="mybeanFactory1"></bean>
<bean factory-bean="mybeanFactory1" factory-method="getBean1"></bean>
public class MybeanFactory1 {
//普通方式
public Mybean getBean1(){
return new Mybean();
}
}
<bean class="_06_bean.MybeanFactory1" id="mybeanFactory1"></bean>
<bean factory-bean="mybeanFactory1" factory-method="getBean1"></bean>