为了账号安全,请及时绑定邮箱和手机立即绑定
  • AOP,面向切面编程,垂直与业务功能,实现方式:预编译和运行期动态代理

    相关概念:

    切面:一个关注点的模块化,可能横切多个对象

    连接点:程序执行过程中某个特定的点

    通知(Advice):在切面的某个特定连接点上执行的动作

    切入点:AOP中通知和一个切入段表达式关联

    引入:不修改代码的前提下,为类添加新的方法和属性

    AOP代理:AOP框架创建的对象,用来实现切面契约

    织入:把切面连接到其他的应用程序类或对象上,并创建一个被通知的对象

    有接口的AOP代理使用JavaSE动态代理,无接口的AOP使用CGLIB代理

    查看全部
  • autowirng 自动装配,跟注入的概念相似,这里是自动的赋值引用 

    xml中定义default-autowire 可以使用byName byType constructor等

    查看全部
  • spring Bean可以实现相应的aware接口,之后在该Bean对象中就可以获取到IOC容器中的一些资源

    查看全部
  • Bean的生命周期

    定义、初始化、使用、销毁

    初始化和销毁都有两种方法:

    • 直接实现spring中某个接口如 DisableBean,覆盖destroy方法

    • 配置init-method 或destroy-method,指向某个方法

    • 或 配置全局的default intitle-method(优先级最低,其他两种方法配置了的时候,默认方法无效)

    查看全部
  • Bean的scope:默认singleton

    singleton一个Bean容器中只存在一份实例

    prototype:每次请求都会创建新的实例 destroy方法无效

    request:每次http请求创建一个实例且仅在当前的request内有效

    session和global session

    查看全部
  • spring注入就是启动spring容器时加载bean配置的时候完成对变量的赋值,只要是针对A类中引用B类的时候。

    常用注入方式:设值注入,xml配置property,A类设置set方法

    构造注入,xml配置constructor- arg,A类设置相应的构造器

    查看全部
    0 采集 收起 来源:Spring注入方式

    2019-05-19

  • @Qualifier:一般和@Autowired一起使用,按类型自动注入时可能会有多个Bean实例的情况,可以使用@Qualifier注解缩小范围(或指定唯一),也可用于指定单独的构造器或方法参数。

    代码:


    @Component(value="invoker")

    public class InterfaceInvoker {

    private List<InjectInterface> list;

    @Autowired()

    @Qualifier(value="one")

    public void setList(List<InjectInterface> list) {

    this.list = list;

    }

    public void say(){

    if(null!=list){

    for (int i=0;i<list.size();i++) {

    System.out.println(list.get(i));

    }

    }else{

    System.out.println("list为null");

    }

    }

    }

    @Component(value="one")

    public class InterfaceImplOne implements InjectInterface {


    }

    @Component

    public class InterfaceImplTwo implements InjectInterface {


    }

    结果:

    injectList.InterfaceImplOne@54266750

    https://img1.sycdn.imooc.com//5cdfc1dd000166e609290571.jpgxml文件中实现@Qualifier功能(不通过@Component)

    https://img1.sycdn.imooc.com//5cdfc3000001bb3809890545.jpg


    https://img1.sycdn.imooc.com//5ce21aaa0001915711040544.jpg

    https://img1.sycdn.imooc.com//5ce21aaa0001fd8411840624.jpg

    https://img1.sycdn.imooc.com//5ce21aaa0001aed411500618.jpg

    https://img1.sycdn.imooc.com//5ce21aab00016b5111410662.jpg


    查看全部
  • 一、可以使用@Autowired注解注入Spring提供的解析依赖性接口(ClassPathXmlApplicationContext、AnnotationApplicationContext、BeanFactory、Envieonment、ResourceLoader、ApplicatonEventPublisher、MessageSource)

    https://img1.sycdn.imooc.com//5cdfaf6d000172fe09080337.jpg二、可以对数组(集合)类型的属性进行注入,注入的是ApplicationContext中所有符合该类型或者是该类型的子类的(List<String>,则会把所有String类型的Bean注入List集合中)。

    https://img1.sycdn.imooc.com//5cdfb06800011e1407300134.jpg

    https://img1.sycdn.imooc.com//5cdfb2330001ae4208300172.jpg

    Key:Bean的Id。

    Value:Bean的对象。

    如果希望数组有序

    1、Bean实现org.springframework.core.Ordered接口

    2、@Order注解(只针对List)

    InterfaceImplTwo添加@Order(value=1)

    InterfaceImplOne添加@Order(value=2),先取出Two的实例,再取出One的实例。

    @Autowired是由Spring BeanPostProcessor处理的,所以不能在配置类中使用它,也就是说要注入集合类型的属性,这些属性的值只能是通过xml或者在配置类中使用@Bean注解加载。

    注入List<BeanInterface>代码:

    public interface InjectInterface {


    }

    @Component

    public class InterfaceImplOne implements InjectInterface {


    }

    @Component

    public class InterfaceImplTwo implements InjectInterface {


    }

    @Configuration

    @ComponentScan("injectList")

    public class InterfaceConfig {

    }

    @Component(value="invoker")

    public class InterfaceInvoker {

    private List<InjectInterface> list;

    @Autowired

    public void setList(List<InjectInterface> list) {

    this.list = list;

    }

    public void say(){

    if(null!=list){

    for (int i=0;i<list.size();i++) {

    System.out.println(list.get(i));

    }

    }else{

    System.out.println("list为null");

    }

    }

    }

    @Test

    public void test(){

    ApplicationContext ac=new AnnotationConfigApplicationContext(InterfaceConfig.class);

    InterfaceInvoker ii=ac.getBean("invoker",InterfaceInvoker.class);

    ii.say();

    }

    结果:

    injectList.InterfaceImplOne@39f46204

    injectList.InterfaceImplTwo@5b4f1255

    注入Map类型<String,InjectInterface>类型属性(和List相似)

    代码:

    @Component(value="invoker")

    public class InterfaceInvoker {

    private Map<String,InjectInterface> map;

    @Autowired

    public void setMap(Map<String, InjectInterface> map) {

    this.map = map;

    }

    public void say(){

    if(map!=null&&map.size()>0){

    for (Entry<String,InjectInterface> ii: map.entrySet()) {

    System.out.println(ii.getKey()+"      "+ii.getValue());

    }

    }

    }

    }




    查看全部
  • Spring之@Autowired注解

    @Required:适用于Bean属性的set方法上,bean属性必须在配置时被填充,通过bean定义或自动装配一个明确的属性值。(不常用)

    https://img1.sycdn.imooc.com//5cdf9c140001346109670354.jpg

    @Autowired:自动注入,一般标识在构造器、set方法、成员变量上如果找不到注入的实例,则抛出异常,可以通过required=true属性来避免。(如果使用required属性,则使用成员变量时应进行判断是否为空)

    注意:每个类的构造器都可以使用@Autowired注解,但只能有一个构造器被标记为Autowired(required=true),required默认为false,这种情况下(解决多个构造器不能使用required属性),@Autowired的必要属性,建议使用@Required注解来代替。

    代码:

    public interface InjectDao {

    public void save(String ss);

    }

    public interface InjectService {

    public void say(String s);

    }

    @Repository(value="dao")

    public class InjectDaoImpl implements InjectDao {

    @Override

    public void save(String ss) {

    System.out.println("dao保存了"+ss+":"+hashCode());

    }

    }

    @Service(value="service")

    public class InjectServiceImpl implements InjectService {

    @Autowired

    private InjectDaoImpl idi;

    @Override

    public void say(String s) {

    System.out.println("service接受了参数"+s);

    idi.save(s);

    }

    }

    @Configuration

    @ComponentScan("Bean")

    public class StoreConfig {


    }

    测试:

    @Test

    public void test(){

    ApplicationContext ac=new AnnotationConfigApplicationContext(StoreConfig.class);

    InjectServiceImpl isi=ac.getBean("service",InjectServiceImpl.class);

    isi.say("今天下雨了");

    }

    结果:

    service接受了参数今天下雨了

    dao保存了今天下雨了:235283278

    构造器注入:

    @Autowired

    public InjectServiceImpl(InjectDaoImpl idi) {

    super();

    this.idi = idi;

    }

    set注入:

    @Autowired

    public InjectServiceImpl(InjectDaoImpl idi) {

    super();

    this.idi = idi;

    }





    查看全部
  • @Scope和@Bean

    @Bean:默认是单例模式。

    @Scope:value属性指定Bean的作用域范围,proxyMode属性指定使用的代理方式(包括接口的代理和类的代理)。

    代理方式主要有两种:针对接口的代理、针对类的代理,实现方式有所区别。前者是jdk动态代理,后者是cglib代理。

    proxyMode:容器启动时bean还没创建 通过cglib代理这个接口或者类注入到其它需要这个bean的bean中


    查看全部
  • Java容器注解@ImportResource和@Value

    一、通过xml文件进行配置。

    <context:property-placeholder  location="资源文件的存放位置"/>:<beans>进行配置,作用是加载资源文件(properties——Key-Value类型资源文件),然后就可以通过${Key},引用资源文件中的内容(如数据库的加载)。

    https://img1.sycdn.imooc.com//5cdf62ef0001c2b207160259.jpg

    https://img1.sycdn.imooc.com//5cdf62ef00011ca911070325.jpg

    代码:

    public class Store {

    public Store(String username,String password,String url){

    System.out.println(username);

    System.out.println(password);

    System.out.println(url);

    }

    <context:property-placeholder location="classpath:/config.properties"/>

    <bean id="store" class="Bean.Store">

    <constructor-arg name="username" value="${jdbc.username}"></constructor-arg>

    <constructor-arg name="password" value="${jdbc.password}"></constructor-arg>

    <constructor-arg name="url" value="${jdbc.url}"></constructor-arg>

    </bean>

    测试:

    @Test

    public void test(){

    ApplicationContext ac=new ClassPathXmlApplicationContext("spring-ioc.xml");

    Store s=ac.getBean("store",Store.class);

    System.out.println(s);

    }

    二、通过注解进行配置前提xml已经编写(配置类中添加@ImportResource("classpath:config.xml") )。

    步骤1:配置类中添加@ImportResource,配置类中定好要用到的属性,并在属性上添加@Value("$(Key)")。

    代码:

    @Configuration

    @ImportResource("classpath:/spring-ioc.xml")

    public class StoreConfig {

    @Value("${url}")

    private String url;

    @Value("${username}")            //取到的是当前操作系统的用户名,所以不要使用username这个名。

    private String username;

    @Value("${password}")

    private String password;

    @Bean(name="store")

    public Store getStoreBean(){

    return new Store(username,password,url);

    }

    }


    步骤二:这种注入依赖于使用@Bean标签,并返回有参构造函数对象,通过参数对Bean进行注入。

    https://img1.sycdn.imooc.com//5cdf66c100017edf11550661.jpg

    代码:xml代码:

            <beans>标签里添加xmlns:context="http://www.springframework.org/schema/context",

           xsi:schemaLocation="http://www.springframework.org/schema/beans

            http://www.springframework.org/schema/beans/spring-beans.xsd

            http://www.springframework.org/schema/context

            http://www.springframework.org/schema/context/spring-context.xsd" ,

    <beans>中添加

    <context:property-placeholder location="classpath:/config.properties"/>

    java代码:

    public class Store {

    public Store(String username,String password,String url){

    System.out.println(username);

    System.out.println(password);

    System.out.println(url);

    }

    配置文件:

    username=\u5C0F\u660E

    password=123456

    url=localhost





    查看全部
  • Java的容器注解说明——@Bean

    @Bean:由SpringIoc容器配置和初始化对象,类似于XML配置文件的<bean/>,。(一般@Bean 需要在配置类中使用,即类上需要加上@Configuration注解)

    @Bean的name属性:可以通过name属性指定Bean的Id,相当于XML中<bean>的Id。

    @Component:如果一个类上标识该注解,表示配置类可以通过@ComponentScan("路径名")扫描到该类,并实例化这个类。

    举例:

    https://img1.sycdn.imooc.com//5cde2b130001cc0411390232.jpg

    @Bean的initMethod属性、destroyMethod属性:通过@Bean实例化Bean时要执行的初始化和销毁逻辑。

    https://img1.sycdn.imooc.com//5cde2ca6000112a505420527.jpg

     

    查看全部
  • @Autowired(required=false):如果找不到注入的实例,则不会抛出异常。

    注意:每个类只能有一个构造器被标记为required=true。

    查看全部
  • @Component:通用型注解,可用于任何Bean。

    @Repository,@Service,@Controller是更有针对性的注解。

    @Repository:通常用于注解DAO层,即持久层。

    @Service:通常用于注解Service层,即服务层。

    @Controller:通常用于Controller层,即控制层(MVC).

    <context:component-scan  base-package="扫描的路径"/>

    查看全部
  • Resources:针对资源文件的统一接口,通过Spring加载一些资源文件的时候,可以通过它去控制。

    ——UrlResource:URL对应的资源,根据一个URL地址即可构建Resources。

    ——ClassPathResoure:获取类路径下的资源文件(相对路径)。

    ——FileSystemResource:获取文件系统里面的资源(绝对路径)。

    ——ServletContextResource:ServletContext封装的资源,用于访问ServletContext环境下的资源。(和Web相关的资源文件的入口)

    ——InputStreamResource:针对于输入流封装的资源。(构建它需要InputStream)

    ——ByteArrayResource:针对于字节数组封装的资源。(构建它需要ByteArray)

    ResourceLoader:对Resource加载的一个类,在SpringIOC容器中,所有的ApplicationContext都实现了ResourceLoader接口,所有的ApplicationContext都可以用来获取Resource实例,所以可以通过getResource(String location)方法获取资源Resource。

    ResourceLoader接口的声明(有个方法,输入为文件的位置,返回的是Resource的实例)

    https://img1.sycdn.imooc.com//5ceb51e40001570111520551.jpg

    ResourceLoader注入参数时前缀的几种类型

    https://img1.sycdn.imooc.com//5ceb523d0001623e11430596.jpg


    ResourceLoader前缀:classpath:(相对路径,加载文件)

                                         file:(绝对路径,加载文件)

                                         url:  http(web路径、加载文件)

                                      (none):直接输入路径,依赖ApplicationContext

    案例:(Bean通过实现ApplicationContext接口,间接的实现了ResourceLoader接口(加载Resource实例),就可以使用getResource()获取Resource的实例,Resource拥有一系列的方法,比如获取文件名称(getFilename()和获取文件长度contentLength()

    https://img1.sycdn.imooc.com//5ceb595a000150b106550460.jpg

    步骤1:

    public class ResourceDemo implements ApplicationContextAware {

    private ApplicationContext ac;

    @Override

    public void setApplicationContext(ApplicationContext ac) throws BeansException {

    this.ac=ac;

    }

    public void resource() throws IOException{

    Resource r=ac.getResource("classpath:resourceDemo.txt");(直接写文件,而不写全路径,是因为Java build path 配置了source,所以这里是相对路径)

    System.out.println(r.getFilename());

    System.out.println(r.contentLength());

    }

    }



    步骤2:

       <bean id="resourceDemo" class="ResourceDemo" ></bean>


    步骤3:

    @Test

    public void testBean() throws IOException{

    ApplicationContext ac=new ClassPathXmlApplicationContext("spring-ioc.xml");

    ResourceDemo rd=(ResourceDemo)ac.getBean("resourceDemo");

    rd.resource();

    }

    测试:

    @Test

    public void testBean() throws IOException{

    ApplicationContext ac=new ClassPathXmlApplicationContext("spring-ioc.xml");

    ResourceDemo rd=(ResourceDemo)ac.getBean("resourceDemo");

    rd.resource();

    }


    结果:(文件:resourceDemo.txt,在src——>resource文件夹下)

    https://img1.sycdn.imooc.com//5ceb57080001728c07670132.jpg

    resourceDemo.txt

    6

    案例:file方式

    https://img1.sycdn.imooc.com//5ceb5a6a000110ac13380462.jpg

    案例:url方式

    https://img1.sycdn.imooc.com//5ceb5b050001bbcb13550479.jpg


    查看全部

举报

0/150
提交
取消
课程须知
Java的高级课程,适合对Java基础知识应用自如,并熟悉MVC架构的小伙伴们。如果想成为一名Java工程师,这门课程是一定要学哒。
老师告诉你能学到什么?
掌握依赖注入、IOC和AOP的概念,并能进行简单应用。

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!