-
SpringAOP 不是为了提供最完整的AOP实现,而是侧重提供一种AOP实现和Spring IoC容器的整合,帮助解决企业中的问题,他是纯 java 实现的,目前只支持方法执行连接点(通知Spring Bean的方法执行)
查看全部 -
AOP 的实现方式
- 预编译,比如 AspectJ
- 运行期动态代理(JDK动态代理,CGLib动态代理),比如SpringAOP,JbossAOP
查看全部 -
Bean的作用域包括 singleton,prototype,request,session,global session
查看全部 -
这节讲的是通过配置文件初始化 bean 对象。要用到 @configuration ,@importResource 以及 @value。@importResource 注解中指明 xml配置文件的路径。另外在 xml 配置文件中配置 location 指明配置文件的路径。
查看全部 -
关于 @bean 和 @component 注解的区别的理解:
@component 直接在类上注解,相当于拿到了整个 xml ,可以直接使用
@bean 更多的是用来对具体的某个类进行配置,他结合 @configuration 使用。例如本例中实际是在配置 storeString 这个类,为此专门写了一个配置类,用 @configuration 对配置类进行注解,再用 @bean 对具体的类进行注解,将要配置的类 storeString 注解成一个 bean 对象,在注解中设置其bean 的 id 以及初始化,销毁的方法对这个类进行配置。
查看全部 -
使用 @bean 注解的时候如果没有指定 bean 的 id 那么默认的 id 就是 方法的名称
@bean 中可以传入 name、init-method、destroy-method等参数,name 指定了 bean 的 id。初始化和销毁的方法在 storeString 类中实现。
查看全部 -
有时候类型是接口的成员变量可能有多个实现类,@qualifier 就是用来缩小范围的,指定使用那个接口的实现类来赋给当前的成员变量
@qualifier 也可以用在参数中,跟上面一样,只是这时候的参数是接口,他也可能是有多个实现类,用这个注解指明要使用的是哪个实现类
查看全部 -
注解为 Map 类型的 bean 其 Key 的类型是 String
查看全部 -
IOC 容器和 bean 的管理有两种实现方式:基于 xml 配置和基于java注解的方式(从Sping3.0开始)
注解中没有指定 bean 的 id 默认使用 类名但是首字母小写
查看全部 -
所有的 applicationContext 都实现了 resource 接口
如果什么都不写,就和 applicationContext 创建方式一样,例如 classpath: test.txt
查看全部 -
实现接口的初始化和销毁先于在配置文件中配置的初始化和销毁方法,他们都会覆盖掉全局配置的这些方法,全局的配置的方法不执行。配置了全局的初始化和销毁方法,即使没有实现这些方法,也不会报错。另外两种方法配置了就必须实现,否则会报错
查看全部 -
通过 new ClassPathXmlApplicationContext() 出来的一个 context (上下文)就是一个容器,每次 new 都创建新的容器
查看全部 -
关于设值方法的注入,我觉得应该是这样的:在 ServiceImpl 中要使用 DAO 的 save 方法,更具体应该是要用 DAOIml 对象的 save 方法,以前都是通过 new DAOIml 然后用 DAO 接口的引用去指向他,然后调用 save 方法,这样才能执行 DAOImpl 对象中的方法啊。视频里面感觉比较陌生的是,在 serviceImlp 中直接声明了 DAO 这个接口,然后在 set 方法中传入了 DAO 类型的参数赋给了他,而不是传入了 DAOImpl 类型的参数,这个编程都只有接口,很突然这么写很突兀。再结合 bean的配置文件,大概明白了这样写的好处。
配置文件中的逻辑很好理解,就是 A 通过 ref 也就是参考的对象B给自己赋值,而这个参考的对象B通过 id 就保证了是唯一确定的。关键就在于这个B的类型是DAOIpml 类型的,也就是他是接口的实现类。好!这样就明白了,IOC 中所有的对象都是 bean,也就是 id 为 B 的 bean其实是 DAO 的实现类的实例对象,可以认为他就是传递给 set 方法的实参,而形参写成接口的好处就体现为:一个实现了接口的类也是接口的类型。这样,形参不是某个具体实现类的类型,我们就可以大胆地在 bean 配置中使用各种这个接口的实现类。
这样给我们在类中赋值的启发就是,把变量设为接口类型,只关注变量的类型而不关注变量的具体值。
bean 的按值注入的过程是怎样的呢?可以这样想,配置文件中A类bean 就是对应了类中的要被赋值的成员变量,B类bean这时自然就是传递进去的和形参对应的实参,仍然是通过实参值传递给形参从而给成员变量赋值。
在 test 中调用的时候,通过父类的 getBean 方法("beanId") 通过唯一的 id 就得到了这个 bean 的 class 对应的实例对象,bean 的 name 就是这个类的成员变量。可以看到,这个 bean 对应的类是 service 接口的实现类,于是调用 save 方法就是实现类中的方法啦~
构造注入也是同理,只是实现类中要有构造方法。有一点值得注意的是,constructor-arg 标签可以看出来它代表的是参数,因此,后面的 name 表示的是参数名,这个参数名要和构造器中的参数名保持一致,后面的 ref 表示了要给这个参数传入的值。proprietary 是属性的意思,后面的 name 表示属性名。
查看全部 -
@PostConstruct 和@PreDestroy 注解 可以声明bean初始化和摧毁时发生的函数。
@name 帮助我们标记 在IOC容器中具有相同类型的的类的bean,定位到我们想要的bean的name(也就是那个bean的id)
查看全部 -
使用@Configuration一般都是配置类,即对某个类的具体参数进行配置和初始化。
查看全部
举报