{"id":1107,"date":"2010-11-04T19:40:11","date_gmt":"2010-11-04T14:10:11","guid":{"rendered":"http:\/\/naveenbalani.com\/?p=1107"},"modified":"2020-10-30T16:48:40","modified_gmt":"2020-10-30T11:18:40","slug":"spring-ioc-tutorial","status":"publish","type":"post","link":"https:\/\/navveenbalani.dev\/index.php\/articles\/spring-framework\/spring-ioc-tutorial\/","title":{"rendered":"Spring IOC Tutorial"},"content":{"rendered":"<p>In my <a href=\"http:\/\/naveenbalani.com\/index.php\/2010\/11\/introduction-to-spring-framework\/\" target=\"_blank\" rel=\"noopener noreferrer\">previous blog<\/a>, I provided an architecture overview of the Spring framework. In this blog, I will follow it up with a simple example of using IOC using Spring. The complete source code for the application is available for <a title=\"spring-ioc-example\" href=\"http:\/\/naveenbalani.com\/wp-content\/uploads\/2010\/11\/spring-ioc-example.zip\" target=\"_blank\" rel=\"noopener noreferrer\">download here.<\/a> However, in this blog we would build the code from scratch.<\/p>\n<p>I&#8217;ll take the use case of online credit card enrollment that we have discussed earlier in <a href=\"http:\/\/naveenbalani.com\/index.php\/2010\/11\/introduction-to-spring-framework\/\" target=\"_self\" rel=\"noopener noreferrer\">Part 1<\/a>. With respect to the implementation, the credit card enrollment requires that the user interact with the following services:<\/p>\n<ul>\n<li>A credit rating service that queries the user&#8217;s credit history information<\/li>\n<li>A remote credit linking service that inserts and links customer information with credit card and bank information for the purpose of automatic debits (if required)<\/li>\n<li>An e-mail service that e-mails the user about the status of his credit card<\/li>\n<\/ul>\n<p><a name=\"5\"><\/a>Three interfaces<\/p>\n<p>For this example, I assume that the services already exist and that it is desirable to integrate them in a loosely coupled manner. The listing 1 below show the application interfaces for the three services.<br \/>\n<a name=\"IDAUGLGB\"><\/a><strong>Listing 1. CreditRatingInterface<\/strong><\/p>\n<pre>public interface CreditRatingInterface {\npublic boolean getUserCreditHistoryInformation(ICustomer iCustomer);\n\n}\n\n<\/pre>\n<p>The credit rating interface shown in Listing 1 provides credit history information. It requires a Customer object containing customer information. The implementation is provided by the CreditRating class.<br \/>\n<a name=\"IDAHHLGB\"><\/a><strong>Listing 2. CreditLinkingInterface<\/strong><\/p>\n<pre>public interface CreditLinkingInterface {\n\npublic String getUrl();\n\npublic void setUrl(String url);\n\npublic void linkCreditBankAccount() throws Exception ;\n\n}\n<\/pre>\n<p>The credit linking interface links credit history information with bank information (if required), and inserts credit card information for the user. The credit linking interface is a remote service whose lookup is made through the getUrl() method. The URL is set by the Spring framework&#8217;s beans configuration mechanism, which I discuss later. The implementation is provided by the CreditLinking class.<!--more--><br \/>\n<a name=\"IDA0HLGB\"><\/a><strong>Listing 3. EmailInterface<\/strong><\/p>\n<pre>public interface EmailInterface {\n\npublic void sendEmail(ICustomer iCustomer);\n\npublic String getFromEmail();\n\npublic void setFromEmail(String fromEmail) ;\n\npublic String getPassword();\n\npublic void setPassword(String password) ;\n\npublic String getSmtpHost() ;\n\npublic void setSmtpHost(String smtpHost);\n\npublic String getUserId() ;\n\npublic void setUserId(String userId);\n}\n<\/pre>\n<p>The EmailInterface is responsible for sending e-mail to the customer regarding the status of his or her credit card. Mail configuration parameters such as SMPT host, user, and password are set by the previously mentioned beans configuration mechanism. The Email class provides the implementation.<br \/>\n<strong><a name=\"6\"><\/a>Spring keeps it loose<\/strong><\/p>\n<p>With all the interfaces in place, the next thing to consider is how to integrate them in a loosely coupled manner. The following <a>Listing <\/a> 4 provides the implementation of the credit card enrollment use case.<\/p>\n<p><a name=\"IDAUGLGB\"><\/a><strong>Listing 4. CreateCreditCardAccount<\/strong><\/p>\n<pre>public class CreateCreditCardAccount implements\nCreateCreditCardAccountInterface {\n\npublic CreditLinkingInterface getCreditLinkingInterface() {\nreturn creditLinkingInterface;\n}\n<span style=\"font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif;\">public void setCreditLinkingInterface(\nCreditLinkingInterface creditLinkingInterface) {\nthis.creditLinkingInterface = creditLinkingInterface;\n}\n\npublic CreditRatingInterface getCreditRatingInterface() {\nreturn creditRatingInterface;\n}\n\npublic void setCreditRatingInterface(\n CreditRatingInterface creditRatingInterface)\n{\nthis.creditRatingInterface = creditRatingInterface;\n}\n\npublic EmailInterface getEmailInterface() {\nreturn emailInterface;\n}\n\npublic void setEmailInterface(EmailInterface emailInterface) {\nthis.emailInterface = emailInterface;\n}\n\n\/\/Client will call this method\npublic void createCreditCardAccount(ICustomer icustomer)\n throws Exception {\n boolean crediRating =\n getCreditRatingInterface().\n getUserCreditHistoryInformation(icustomer);\n icustomer.setCreditRating(crediRating);\n \/\/Good Rating\n if(crediRating){\n getCreditLinkingInterface().linkCreditBankAccount(icustomer);\n }\n\n getEmailInterface().sendEmail(icustomer);\n\n}\nNote that all the setter methods are implemented by Spring configuration beans. All the dependencies (that is, the three interfaces) can be injected by the Spring framework using these beans. The createCreditCardAccount() method will then use the services to carry out the remainder of the implementation.<\/span>\n<\/pre>\n<p>The following <a>Listing 5 provides<\/a> the Spring configuration file for our application.<\/p>\n<p><a name=\"IDAUGLGB\"><\/a><strong>Listing 5. Spring Configuration<br \/>\n<\/strong><\/p>\n<pre>&lt;?xml version=\u201d1.0\u2033 encoding=\u201dUTF-8\u2033?&gt;\n\n&lt;beans xmlns=\u201dhttp:\/\/www.springframework.org\/schema\/beans\u201d\n\nxmlns:xsi=\u201dhttp:\/\/www.w3.org\/2001\/XMLSchema-instance\u201d\n\nxsi:schemaLocation=\u201dhttp:\/\/www.springframework.org\/schema\/beans\n\nhttp:\/\/www.springframework.org\/schema\/beans\/spring-beans-3.0.xsd\u201d&gt;\n\n&lt;\u2013 standard bean declaration \u2013&gt;\n\n&lt;bean id=\u201dcreateCreditCard\u201d&gt;\n\n&lt;property name=\u201dcreditRatingInterface\u201d&gt;\n\n&lt;\u2013 reference bean declaration wired as a property using the ref bean tag \u2013&gt;\n\n&lt;ref bean=\u201dcreditRating\u201d \/&gt;\n\n&lt;\/property&gt;\n\n&lt;property name=\u201dcreditLinkingInterface\u201d&gt;\n\n&lt;ref bean=\u201dcreditLinking\u201d \/&gt;\n\n&lt;\/property&gt;\n\n&lt;property name=\u201demailInterface\u201d&gt;\n\n&lt;ref bean=\u201demail\u201d \/&gt;\n\n&lt;\/property&gt;\n\n&lt;\/bean&gt;\n\n&lt;bean id=\u201dcreditLinking\u201d&gt;\n\n&lt;property name=\u201durl\u201d&gt;\n\n&lt;value&gt;http:\/\/localhost\/creditLinkService&lt;\/value&gt;\n\n&lt;\/property&gt;\n\n&lt;\/bean&gt;\n\n&lt;bean id=\u201dcreditRating\u201d&gt;\n\n&lt;\/bean&gt;\n\n&lt;bean id=\u201demail\u201d&gt;\n\n&lt;property name=\u201dsmtpHost\u201d&gt;\n\n&lt;value&gt;localhost&lt;\/value&gt;\n\n&lt;\/property&gt;\n\n&lt;property name=\u201dfromEmail\u201d&gt;\n\n&lt;value&gt;mycompanyadmin@mycompanyadmin.com&lt;\/value&gt;\n\n&lt;\/property&gt;\n\n&lt;property name=\u201duserId\u201d&gt;\n\n&lt;value&gt;myuserid&lt;\/value&gt;\n\n&lt;\/property&gt;\n\n&lt;property name=\u201dpassword\u201d&gt;\n\n&lt;value&gt;mypassword&lt;\/value&gt;\n\n&lt;\/property&gt;\n\n&lt;\/bean&gt;\n\n&lt;\/beans&gt;\n\n\n<\/pre>\n<pre><\/pre>\n<p>From version 2.0, Spring framework introduced XML Schema support for configuration schema validation. The major advantage of XML Schema support was that it allowed custom namespaces from other modules and frameworks to added in configuration file which simplifies Spring configurations.<\/p>\n<p><strong><a name=\"7\"><\/a>Run the application<\/strong><\/p>\n<p>To run the example application you must first download the source code project from the resources section. We would be using Maven tool to build and run the sample application. Please download the latest version of Maven from resources section if you don&#8217;t have Maven installed on your system.<\/p>\n<p>Next, extract the source code to a folder such as <em>c:\\<\/em> and a <em>SpringProject<\/em> folder will be created. You would find the following structure as shown in figure below.<br \/>\n<a name=\"fig2\"><\/a><strong>Figure 1. The source code structure<\/strong><\/p>\n<p><img loading=\"lazy\" class=\"aligncenter size-full wp-image-1121\" title=\"build-structure\" src=\"http:\/\/naveenbalani.com\/wp-content\/uploads\/2010\/11\/build-structure.gif\" alt=\"build-structure\" width=\"292\" height=\"173\" \/><\/p>\n<p>The pom.xml is the maven build file for the project. The following l<a>isting provides<\/a> the pom.xml file. Please look at the in-line comments for explanation of the tags.<\/p>\n<p><a name=\"IDAUGLGB\"><\/a><strong>Listing 6. Maven build file<br \/>\n<\/strong><\/p>\n<pre class=\"p1\">&lt;project xmlns=\u201dhttp:\/\/maven.apache.org\/POM\/4.0.0\u2033 xmlns:xsi=\u201dhttp:\/\/www.w3.org\/2001\/XMLSchema-instance\u201d xsi:schemaLocation=\u201dhttp:\/\/maven.apache.org\/POM\/4.0.0 http:\/\/maven.apache.org\/maven-v4_0_0.xsd\u201d&gt; \n&lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt; \n&lt;groupId&gt;spring-series&lt;\/groupId&gt; \n&lt;artifactId&gt;spring-series-part-one&lt;\/artifactId&gt; &lt;packaging&gt;jar&lt;\/packaging&gt; \n&lt;version&gt;1.0-SNAPSHOT&lt;\/version&gt; \n&lt;name&gt;spring-series-part-one&lt;\/name&gt; &lt;url&gt;http:\/\/maven.apache.org&lt;\/url&gt; \n&lt;build&gt; \n&lt;!\u2013Source Directory \u2013&gt; \n&lt;sourceDirectory&gt;src&lt;\/sourceDirectory&gt;\n&lt;resources&gt; &lt;resource&gt; \n&lt;directory&gt;src&lt;\/directory&gt; \n&lt;includes&gt; \n&lt;include&gt;**\/*.properties&lt;\/include&gt; \n&lt;include&gt;**\/*.xml&lt;\/include&gt; \n&lt;\/includes&gt; \n&lt;\/resource&gt; \n&lt;\/resources&gt; \n&lt;plugins&gt; \n&lt;plugin&gt; \n&lt;artifactId&gt;maven-compiler-plugin&lt;\/artifactId&gt; \n&lt;configuration&gt; \n&lt;source&gt;1.5&lt;\/source&gt;\n&lt;target&gt;1.5&lt;\/target&gt; \n&lt;\/configuration&gt;\n&lt;\/plugin&gt;\n&lt;\/plugins&gt;\n&lt;\/build&gt;\n&lt;properties&gt; \n&lt;!\u2013 Set the latest Spring version here \u2013&gt; &lt;spring-version&gt;3.0.2.RELEASE&lt;\/spring-version&gt;\n&lt;\/properties&gt; &lt;dependencies&gt;\n&lt;dependency&gt; &lt;!\u2013 Spring core dependency \u2013&gt; \n&lt;!\u2013 Spring context dependency. The Spring core depedency is \u2013&gt; \n&lt;!\u2013 pulled by Spring context ,so we don\u2019t need to \u2013&gt; \n&lt;!\u2013 expliclity include it. Added her only for reference \u2013&gt; &lt;groupId&gt;org.springframework&lt;\/groupId&gt; \n&lt;artifactId&gt;spring-core&lt;\/artifactId&gt; \n&lt;version&gt;${spring-version}&lt;\/version&gt; \n&lt;optional&gt;true&lt;\/optional&gt; \n&lt;\/dependency&gt; \n&lt;dependency&gt;\n&lt;groupId&gt;org.springframework&lt;\/groupId&gt;\n&lt;artifactId&gt;spring-context&lt;\/artifactId&gt;\n&lt;version&gt;${spring-version}&lt;\/version&gt;\n&lt;\/dependency&gt;\n&lt;\/dependencies&gt; \n&lt;\/project&gt;\n\n<\/pre>\n<pre><\/pre>\n<p>From version 3.0, Spring introduced module based sources and binaries, so instead of having one spring.jar dependency as in earlier release in pom.xml, you would find relevant module dependency as part of pom.xml. For our example, we require only spring-core and spring-context module.<\/p>\n<p>Open up the command prompt, change the directory to <em>SpringProject<\/em>, and type in the following at command prompt &gt; mvn clean install.<\/p>\n<p>It will build the source code and put the class files under the target folder. The following figure 2 shows the output generated upon running the mvn clean install command<br \/>\n<a name=\"fig3\"><\/a><strong>Figure 2. Build output<\/strong><br \/>\n<img loading=\"lazy\" class=\"aligncenter size-full wp-image-1122\" title=\"build-output\" src=\"http:\/\/naveenbalani.com\/wp-content\/uploads\/2010\/11\/build-output.gif\" alt=\"build-output\" width=\"566\" height=\"388\" srcset=\"https:\/\/navveenbalani.dev\/wp-content\/uploads\/2010\/11\/build-output.gif 566w, https:\/\/navveenbalani.dev\/wp-content\/uploads\/2010\/11\/build-output-300x205.gif 300w\" sizes=\"(max-width: 566px) 100vw, 566px\" \/><\/p>\n<p>You will now execute the Java client program CreateCreditAccountClient by giving the following command on the command prompt window<\/p>\n<p>mvn exec:java -Dexec.mainClass=springexample.client.CreateCreditAccountClient<\/p>\n<p>This will run the CreateCreditAccountClient class, which in turn will create a Customer class object and populate it and also call the CreateCreditCardAccount class to create and link the credit card account. The CreateCreditAccountClient will also load the Spring configuration files through ClassPathXmlApplicationContext. Once the beans are loaded, you can then access them through the getBean() method as shown, finally, in Listing 6.<br \/>\n<a name=\"code8\"><\/a><strong>Listing 6. Loading the Spring configuration file<\/strong><\/p>\n<pre>ClassPathXmlApplicationContext appContext =\nnew ClassPathXmlApplicationContext(new String[] {\n\"spring\/springexample-creditaccount.xml\"\n});\n\nCreateCreditCardAccountInterface creditCardAccount =\n(CreateCreditCardAccountInterface)\nappContext.getBean(\"createCreditCard\");\n<\/pre>\n<p>Upon executing this command, the following output as shown in figure 3 below would be displayed. If you look at the INFO: log event highlighted in output below, you would see the beans : createCreditCard, creditRating, creditLinking and email being loaded by the Spring container based on the springexample-creditaccount.xml file.<br \/>\n<a name=\"fig4\"><\/a><strong>Figure 3. Project output<\/strong><br \/>\n<img loading=\"lazy\" class=\"aligncenter size-full wp-image-1123\" title=\"project-output\" src=\"http:\/\/naveenbalani.com\/wp-content\/uploads\/2010\/11\/project-output.gif\" alt=\"project-output\" width=\"522\" height=\"282\" srcset=\"https:\/\/navveenbalani.dev\/wp-content\/uploads\/2010\/11\/project-output.gif 522w, https:\/\/navveenbalani.dev\/wp-content\/uploads\/2010\/11\/project-output-300x162.gif 300w\" sizes=\"(max-width: 522px) 100vw, 522px\" \/><\/p>\n<p><strong><a name=\"8\"><\/a>In conclusion<\/strong><\/p>\n<p>In this second article of the <em>Spring Series<\/em>, we looked at a simple example on how the IOC pattern (as implemented by the Spring IOC container) works and how to inject dependencies, or services, into a working credit card account application rather than having to build them in from the ground up. Stay tuned for more article in the series.<\/p>\n<p>The Spring series articles was originally published in June 2005 by IBM DevelopeWorks. Based on the readers inputs, this article is now updated to latest 3.0.5 release.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In my previous blog, I provided an architecture overview of the Spring framework. In this blog, I will follow it up with a simple example of using IOC using Spring. The complete source code for the application is available for download here. However, in this blog we would build the code from scratch. I&#8217;ll take [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1121,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[5],"tags":[14,44,45],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v16.0.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Spring IOC Tutorial - Current and Future Technology Trends by Navveen Balani<\/title>\n<meta name=\"description\" content=\"Spring IOC Tutorial - Spring framework\" \/>\n<link rel=\"canonical\" href=\"https:\/\/navveenbalani.dev\/index.php\/articles\/spring-framework\/spring-ioc-tutorial\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Spring IOC Tutorial - Current and Future Technology Trends by Navveen Balani\" \/>\n<meta property=\"og:description\" content=\"Spring IOC Tutorial - Spring framework\" \/>\n<meta property=\"og:url\" content=\"https:\/\/navveenbalani.dev\/index.php\/articles\/spring-framework\/spring-ioc-tutorial\/\" \/>\n<meta property=\"og:site_name\" content=\"Current and Future Technology Trends by Navveen Balani\" \/>\n<meta property=\"article:published_time\" content=\"2010-11-04T14:10:11+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-10-30T11:18:40+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/navveenbalani.dev\/wp-content\/uploads\/2010\/11\/build-structure.gif\" \/>\n\t<meta property=\"og:image:width\" content=\"292\" \/>\n\t<meta property=\"og:image:height\" content=\"173\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\">\n\t<meta name=\"twitter:data1\" content=\"8 minutes\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/navveenbalani.dev\/#website\",\"url\":\"https:\/\/navveenbalani.dev\/\",\"name\":\"Current and Future Technology Trends by Navveen Balani\",\"description\":\"Current and Future Technology Trends by Navveen Balani\",\"publisher\":{\"@id\":\"https:\/\/navveenbalani.dev\/#\/schema\/person\/51f7ab14b20611d95e3c7fd4ea0950bf\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"https:\/\/navveenbalani.dev\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/spring-framework\/spring-ioc-tutorial\/#primaryimage\",\"inLanguage\":\"en-US\",\"url\":\"https:\/\/navveenbalani.dev\/wp-content\/uploads\/2010\/11\/build-structure.gif\",\"width\":\"292\",\"height\":\"173\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/spring-framework\/spring-ioc-tutorial\/#webpage\",\"url\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/spring-framework\/spring-ioc-tutorial\/\",\"name\":\"Spring IOC Tutorial - Current and Future Technology Trends by Navveen Balani\",\"isPartOf\":{\"@id\":\"https:\/\/navveenbalani.dev\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/spring-framework\/spring-ioc-tutorial\/#primaryimage\"},\"datePublished\":\"2010-11-04T14:10:11+00:00\",\"dateModified\":\"2020-10-30T11:18:40+00:00\",\"description\":\"Spring IOC Tutorial - Spring framework\",\"breadcrumb\":{\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/spring-framework\/spring-ioc-tutorial\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/navveenbalani.dev\/index.php\/articles\/spring-framework\/spring-ioc-tutorial\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/spring-framework\/spring-ioc-tutorial\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/navveenbalani.dev\/\",\"url\":\"https:\/\/navveenbalani.dev\/\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/spring-framework\/spring-ioc-tutorial\/\",\"url\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/spring-framework\/spring-ioc-tutorial\/\",\"name\":\"Spring IOC Tutorial\"}}]},{\"@type\":\"Article\",\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/spring-framework\/spring-ioc-tutorial\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/spring-framework\/spring-ioc-tutorial\/#webpage\"},\"author\":{\"@id\":\"https:\/\/navveenbalani.dev\/#\/schema\/person\/51f7ab14b20611d95e3c7fd4ea0950bf\"},\"headline\":\"Spring IOC Tutorial\",\"datePublished\":\"2010-11-04T14:10:11+00:00\",\"dateModified\":\"2020-10-30T11:18:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/spring-framework\/spring-ioc-tutorial\/#webpage\"},\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/navveenbalani.dev\/#\/schema\/person\/51f7ab14b20611d95e3c7fd4ea0950bf\"},\"image\":{\"@id\":\"https:\/\/navveenbalani.dev\/index.php\/articles\/spring-framework\/spring-ioc-tutorial\/#primaryimage\"},\"keywords\":\"spring,Spring series tutorial,spring tutorial\",\"articleSection\":\"Spring framework\",\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/navveenbalani.dev\/#\/schema\/person\/51f7ab14b20611d95e3c7fd4ea0950bf\",\"name\":\"Navveen\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\/\/navveenbalani.dev\/#personlogo\",\"inLanguage\":\"en-US\",\"url\":\"https:\/\/navveenbalani.dev\/wp-content\/uploads\/2019\/07\/navveen_balani.jpeg\",\"width\":200,\"height\":200,\"caption\":\"Navveen\"},\"logo\":{\"@id\":\"https:\/\/navveenbalani.dev\/#personlogo\"},\"sameAs\":[\"http:\/\/naveenbalani.com\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","_links":{"self":[{"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/posts\/1107"}],"collection":[{"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/comments?post=1107"}],"version-history":[{"count":41,"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/posts\/1107\/revisions"}],"predecessor-version":[{"id":3041,"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/posts\/1107\/revisions\/3041"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/media\/1121"}],"wp:attachment":[{"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/media?parent=1107"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/categories?post=1107"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/navveenbalani.dev\/index.php\/wp-json\/wp\/v2\/tags?post=1107"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}